📜  TurboGears-使用MongoDB

📅  最后修改于: 2020-10-19 03:35:25             🧑  作者: Mango


TurboGears还支持MongoDB文档数据库。它使用目标文档映射器API Ming。 Ming的用法与SQLAlchemy非常相似。 Ming查询语言可以将基于SQLAlchemy的TurboGears项目移植到Ming。

什么是PyMongo

PyMongo是一个Python发行版,其中包含用于MongoDB的工具。 Ming扩展了PyMongo提供-

  • 声明式模型
  • 模式验证和转换
  • 模式演变
  • 纯InMemory MongoDB实现
  • 工作单位
  • 身份图
  • 一对多,多对一和多对多关系

首先,您需要下载并安装MongoDB。可以从https://www.mongodb.org/downloads下载MongoDB的最新发行版

在Windows上,通过提供-dbpath选项启动MongoDB服务器-

C:\mongodb\bin>Mongod --dbpath d:\mongo

D:\ mongo文件夹指定用于存储MongoDB数据库。服务器从http:// localhost:27017开始侦听现在要启动MongoDB Shell,请使用以下命令-

C:\mongodb\bin>Mongo

现在我们的MongoDB环境已经准备就绪。

现在使用-ming选项创建一个TurboGears项目-

gearbox quickstart --ming Hello

这个快速启动的项目将提供一个身份验证和授权层,类似于为SQLAlchemy版本提供的层。现在,该应用程序将尝试连接到本地计算机上端口27017上的服务器。项目文件夹中的development.ini文件包含以下设置-

ming.url = mongodb://localhost:27017/
ming.db = hello

使用以下命令设置项目-

Python setup.py develop

项目文件夹包含models子文件夹,其中包含以下文件-

  • __init__.py-这是建立数据库访问的地方。您的收藏集应导入此模块。例如,我们将在此程序包中添加学生集合。

  • session.py-此文件定义数据库连接会话。每次必须声明MappedClass来指定要执行查询的会话时,都需要导入此文件。

  • auth.py-如果您在快速入门中启用了身份验证和授权,则将创建此文件。它定义了三个集合repoze .who ,它们进一步依赖于:User,Group和Permission。

定义您的收藏

默认情况下,TurboGears以声明模式配置Ming。这类似于SQLAlchemy声明性支持,并且需要每个模型都从MappedClass类继承。

MappedClass要求内部有__mongometa__子类,该子类进一步提供有关存储文档的集合名称和用于存储文档的会话的详细信息。

MappedClass还包含文档中字段的定义。 Ming的odm模块具有不同类型的字段属性的定义-

  • 领域属性
  • ForeignIdProperty
  • 关系属性

ming.schema模块定义以下数据类型-

  • 明式模式
  • ming.schema.Array
  • 明式二进制
  • 明式模式
  • 明式浮点数
  • 明码模式
  • ming.schema.ObjectId
  • 明模式标量
  • ming.schema.String

要在此模型中添加学生集合,请将以下代码另存为hello / models文件夹中的student.py。

你好\模型\ student.py

from ming import schema
from ming.odm import MappedClass
from ming.odm import FieldProperty, ForeignIdProperty
from hello.model import DBSession
   
Class student(MappedClass):
   class __mongometa__:
      session = DBSession
      name = 'student'
      
   _id = FieldProperty(schema.ObjectId)
   name = FieldProperty(schema.String(required = True))
   city = FieldProperty(schema.String(if_missing = ''))
   address = FieldProperty(schema.String(if_missing = ''))
   pincode = FieldProperty(schema.String(if_missing = ''))

最后,将此模型包含在hello \ models \ __ init__.py中

# Import your model modules here.
from hello.model.auth import User, Group, Permission
from hello.model.student import student

要设置这些模型,请运行以下gearbox命令-

Gearbox setup-app

使用以下变速箱命令启动服务器-

Gearbox serve –reload –debug

打开此应用程序的主页(http:// localhost:8080 /),然后使用管理员凭据登录。该应用程序的“管理”页面将显示设置的模型列表。 (以管理员身份登录,密码管理密码)

主页申请

集合的创建也可以在MongoDB Web界面以及MongoDB Shell中进行验证。

ODMSession用于使用以下功能执行多个数据库操作-

  • model.query.find()
  • model.query.find_and_modify()
  • model.remove()
  • model.update()
  • model.flush()

设计ToscoWidget表单

现在,我们将设计一个ToscoWidget表单来输入学生数据并将其添加到学生模型下面的表中。

以下是用于创建studentform.py的代码-

你好\控制器\ studentform.py

import tw2.core as twc
import tw2.forms as twf
   
class StudentForm(twf.Form):

   class child(twf.TableLayout):
      name = twf.TextField(size = 20)
      city = twf.TextField()
      address = twf.TextArea("",rows = 5, cols = 30)
      pincode = twf.NumberField()
        
   action = '/save_record'
   submit = twf.SubmitButton(value = 'Submit')     

在应用程序的Rootcontroller’/ add’URL中,调用add()函数,这将在浏览器中打开上述设计的表单。然后,其提交按钮调用save_record()函数。它检索表单数据并将其保存在学生表中,然后将应用程序重定向到“ / listrec” URL,这将公开学生列表模板。

此活动的root.py如下-

你好/控制器/root.py

from hello.lib.base import BaseController
from tg import expose, flash, redirect, request,url, lurl
from tg import redirect, validate
from hello import model
from hello.model import DBSession
from hello.model.student import student
   
from hello.controllers.studentform import StudentForm
   
class RootController(BaseController):
   @expose()
   def index(self):
      return "

Hello World

" @expose ("hello.templates.studentlist") def listrec(self): entries = student.query.find() return dict(entries = entries) @expose('hello.templates.studentform') def add(self, *args, **kw): return dict(page = 'studentform', form = StudentForm) @expose() def save_record(self, **kw): newstudent = student(name = kw['name'],city = kw['city'], address = kw['address'], pincode = kw['pincode']) DBSession.flush() flash(message = "new entry added successfully") redirect("/listrec")

在模板文件夹中创建以下模板-

Hello \ templates \ studentform.html

Student Registration Form
   
    

   
      
${form.display(value = dict(title = 'Enter data'))}

Hello \ templates \ studentlist.html


      Welcome to TurboGears
   
   
   
      

Welcome to TurboGears

Current Entries

Name City Address Pincode
${entry.name} ${entry.city} ${entry.address} ${entry.pincode}

重新启动服务器,然后在浏览器中输入http:// localhost:8080 / add-

学生登记表

每次添加数据并按下提交按钮时,都会显示当前条目的列表。

新条目输出