文章内容
2019/12/29 15:35:04,作 者: 黄兵
Flask-MongoEngine
Flask扩展,可与MongoEngine集成。有关MongoEngine的更多信息,请查阅MongoEngine文档。
它为您的应用程序处理连接管理。您还可以将WTForms用作模型的模型形式。
安装Flask-MongoEngine
使用pip的方式安装:
pip install flask-mongoengine
配置
基本设置很容易,只需获取扩展名即可:
from flask_mongoengine import MongoEngine
app = Flask(__name__)
app.config.from_pyfile('the-config.cfg')
db = MongoEngine(app)或者,如果要在初始化应用程序之前设置数据库,那么应用程序工厂就是这种情况:
from flask import Flask
from flask_mongoengine import MongoEngine
db = MongoEngine()
...
app = Flask(__name__)
app.config.from_pyfile('the-config.cfg')
db.init_app(app)默认情况下,Flask-MongoEngine假定mongod实例在本地主机上的端口27017上运行,并且您希望连接到名为test的数据库。
如果MongoDB在其他地方运行,则应在app.config的“ MONGODB_SETTINGS”字典中提供host和port设置:
app.config['MONGODB_SETTINGS'] = {
'db': 'project1',
'host': '192.168.1.35',
'port': 12345
}
如果数据库需要身份验证, 则应在app.config中为username和password参数提供'MONGODB_SETTINGS'字典。
app.config['MONGODB_SETTINGS'] = {
'db': 'project1',
'username':'webapp',
'password':'pwd123'
}还支持Uri样式的连接,只需将uri作为app.confighost 的'MONGODB_SETTINGS'字典中提供即可。请注意,来自uri的数据库名称优先于名称。
app.config['MONGODB_SETTINGS'] = {
'db': 'project1',
'host': 'mongodb://localhost/database_name'
}连接设置也可以通过在app.config中以'MONGODB_'作为前缀来单独提供:
app.config['MONGODB_DB'] = 'project1' app.config['MONGODB_HOST'] = '192.168.1.35' app.config['MONGODB_PORT'] = 12345 app.config['MONGODB_USERNAME'] = 'webapp' app.config['MONGODB_PASSWORD'] = 'pwd123'
默认情况下,flask-mongoengine会在实例化扩展名时打开连接,但是您可以通过将MONGODB_SETTINGS['connect']参数或其MONGODB_CONNECT平面等效设置为,将其配置为仅在首次访问数据库时打开连接False:
app.config['MONGODB_SETTINGS'] = {
'host': 'mongodb://localhost/database_name',
'connect': False,
}
# or
app.config['MONGODB_CONNECT'] = False自定义查询集
flask-mongoengine将以下方法附加到Mongoengine的默认QuerySet:
- get_or_404:与.get()相似,但如果对象DidNotExist存在,则调用abort(404)。
- first_or_404:与上述相同,除了.first()。
- paginate:对QuerySet分页。接受两个参数page和per_page。
- paginate_field:从QuerySet中的一个文档分页一个字段。参数:field_name,doc_id,page,per_page。
例子:
# 404 if object doesn't exist
def view_todo(todo_id):
todo = Todo.objects.get_or_404(_id=todo_id)
..
# Paginate through todo
def view_todos(page=1):
paginated_todos = Todo.objects.paginate(page=page, per_page=10)
# Paginate through tags of todo
def view_todo_tags(todo_id, page=1):
todo = Todo.objects.get_or_404(_id=todo_id)
paginated_tags = todo.paginate_field('tags', page, per_page=10)分页对象的属性包括:iter_pages,next,prev,has_next,has_prev,next_num,prev_num。
在模板中:
MongoEngine和WTForms
flask-mongoengine从MongoEngine模型自动生成WTForms:
from flask_mongoengine.wtf import model_form
class User(db.Document):
email = db.StringField(required=True)
first_name = db.StringField(max_length=50)
last_name = db.StringField(max_length=50)
class Content(db.EmbeddedDocument):
text = db.StringField()
lang = db.StringField(max_length=3)
class Post(db.Document):
title = db.StringField(max_length=120, required=True, validators=[validators.InputRequired(message=u'Missing title.'),])
author = db.ReferenceField(User)
tags = db.ListField(db.StringField(max_length=30))
content = db.EmbeddedDocumentField(Content)
PostForm = model_form(Post)
def add_post(request):
form = PostForm(request.POST)
if request.method == 'POST' and form.validate():
# do something
redirect('done')
return render_template('add_post.html', form=form)对于每个MongoEngine字段,使用最合适的WTForm字段。如果转换不是隐式的,则参数允许用户提供提示:
PostForm = model_form(Post, field_args={'title': {'textarea': True}})支持的参数:
对于具有选择的字段:
- 多使用SelectMultipleField
- 收音机使用RadioField
对于StringField:
- 密码使用PasswordField
- textarea使用TextAreaField
(默认情况下,当且仅当StringField没有max_length时,它才会转换为TextAreaField。)
支持的字段
- StringField
- BinaryField
- URLField
- EmailField
- IntField
- FloatField
- DecimalField
- 布尔字段
- DateTimeField
- ListField(使用wtforms.fields.FieldList)
- SortedListField(重复的ListField)
- EmbeddedDocumentField(使用wtforms.fields.FormField并生成内联Form)
- ReferenceField(使用wtforms.fields.SelectFieldBase和从QuerySet或Document加载的选项)
- DictField
当前不支持的字段类型
- ObjectIdField
- GeoLocationField
- GenericReferenceField
Session接口
要将MongoEngine用作会话存储,只需配置会话接口:
from flask_mongoengine import MongoEngine, MongoEngineSessionInterface app = Flask(__name__) db = MongoEngine(app) app.session_interface = MongoEngineSessionInterface(db)
调试工具栏面板

如果使用Flask-DebugToolbar,则可以将'flask_mongoengine.panels.MongoDebugPanel'添加 到DEBUG_TB_PANELS配置列表中,然后它将自动跟踪您的查询:
from flask import Flask from flask_debugtoolbar import DebugToolbarExtension app = Flask(__name__) app.config['DEBUG_TB_PANELS'] = ['flask_mongoengine.panels.MongoDebugPanel'] db = MongoEngine(app) toolbar = DebugToolbarExtension(app)
文章来源:Flask-MongoEngine
评论列表