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://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的默认查询集
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)
致谢
灵感来自两个仓库
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。