📅  最后修改于: 2020-10-19 03:35:25             🧑  作者: Mango
TurboGears还支持MongoDB文档数据库。它使用目标文档映射器API Ming。 Ming的用法与SQLAlchemy非常相似。 Ming查询语言可以将基于SQLAlchemy的TurboGears项目移植到Ming。
PyMongo是一个Python发行版,其中包含用于MongoDB的工具。 Ming扩展了PyMongo提供-
首先,您需要下载并安装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模块具有不同类型的字段属性的定义-
ming.schema模块定义以下数据类型-
要在此模型中添加学生集合,请将以下代码另存为hello / models文件夹中的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用于使用以下功能执行多个数据库操作-
现在,我们将设计一个ToscoWidget表单来输入学生数据并将其添加到学生模型下面的表中。
以下是用于创建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如下-
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")
在模板文件夹中创建以下模板-
Student Registration Form
${form.display(value = dict(title = 'Enter data'))}
Welcome to TurboGears
Welcome to TurboGears
Current Entries
Name
City
Address
Pincode
${entry.name}
${entry.city}
${entry.address}
${entry.pincode}
重新启动服务器,然后在浏览器中输入http:// localhost:8080 / add-
每次添加数据并按下提交按钮时,都会显示当前条目的列表。