Flask-MongoEngine是一个Flask扩展,它提供了与MongoEngine和WTF模型表单的集成。
项目描述
Flask-MongoEngine
Flask 扩展,提供与 MongoEngine 的集成。有关MongoEngine的更多信息,请参阅 MongoEngine 文档。
它处理应用程序的连接管理。您还可以使用 WTForms 作为模型表单。
先决条件
确保您已安装 wheel
pip install wheel
安装 Flask-MongoEngine
使用 pip 安装
pip install flask-mongoengine
配置
基本设置很简单,只需获取扩展即可
from flask import Flask
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 实例正在 localhost 的 27017 端口上运行,并且您希望连接到名为 test 的数据库。
如果MongoDB在别处运行,您应通过在 ‘MONGODB_SETTINGS’ 字典中提供 host 和 port 设置来提供 app.config。
app.config['MONGODB_SETTINGS'] = {
'db': 'project1',
'host': '192.168.1.35',
'port': 12345
}
如果数据库需要身份验证,应在 ‘MONGODB_SETTINGS’ 字典中提供 username 和 password 参数 app.config。
app.config['MONGODB_SETTINGS'] = {
'db': 'project1',
'username':'webapp',
'password':'pwd123'
}
也支持URI样式连接,只需在 ‘MONGODB_SETTINGS’ 字典中的 host 提供URI即可。 注意,URI中的数据库名称优先于名称。 如果uri存在且不包含数据库名称 db 设置,则完全忽略并设置数据库名为‘test’。
app.config['MONGODB_SETTINGS'] = {
'db': 'project1',
'host': 'mongodb:///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:///database_name',
'connect': False,
}
# or
app.config['MONGODB_CONNECT'] = False
自定义查询集
flask-mongoengine 将以下方法附加到Mongoengine的默认查询集
get_or_404:与 .get() 一样工作,但如果对象不存在,则调用 abort(404)。可选参数:message - 要显示的自定义消息。
first_or_404:与上述类似,但为 .first()。可选参数:message - 要显示的自定义消息。
paginate:分页查询集。接受两个参数,page 和 per_page。
paginate_field:从查询集中的单个文档分页一个字段。参数: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。
在模板中
{# Display a page of todos #}
<ul>
{% for todo in paginated_todos.items %}
<li>{{ todo.title }}</li>
{% endfor %}
</ul>
{# Macro for creating navigation links #}
{% macro render_navigation(pagination, endpoint) %}
<div class=pagination>
{% for page in pagination.iter_pages() %}
{% if page %}
{% if page != pagination.page %}
<a href="{{ url_for(endpoint, page=page) }}">{{ page }}</a>
{% else %}
<strong>{{ page }}</strong>
{% endif %}
{% else %}
<span class=ellipsis>…</span>
{% endif %}
{% endfor %}
</div>
{% endmacro %}
{{ render_navigation(paginated_todos, 'view_todos') }}
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='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}})
支持的参数
对于具有 choices 的字段
使用 multiple 选择 SelectMultipleField
使用 radio 选择 RadioField
对于 StringField
使用 password 选择 PasswordField
使用 textarea 选择 TextAreaField
对于 ListField
使用 min_entries 设置最小条目数
(默认情况下,如果 StringField 没有max_length,则将其转换为 TextAreaField。)
支持的字段
StringField
BinaryField
URLField
EmailField
IntField
FloatField
DecimalField
BooleanField
DateTimeField
ListField (使用 wtforms.fields.FieldList)
SortedListField (重复 ListField)
EmbeddedDocumentField (使用 wtforms.fields.FormField 并生成内联 Form)
ReferenceField (使用 wtforms.fields.SelectFieldBase,选项从 QuerySet 或 Document 中加载)
DictField
目前不支持的字段类型
ObjectIdField
GeoLocationField
GenericReferenceField
会话接口
要将 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)
升级
从 0.6 升级到 0.7
ListFieldPagination 参数顺序已更改,以更符合逻辑
# Old order ListFieldPagination(self, queryset, field_name, doc_id, page, per_page, total) # New order ListFieldPagination(self, queryset, doc_id, field_name, page, per_page, total)
致谢
灵感来自两个仓库
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。