跳转到主要内容

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 实例正在 localhost27017 端口上运行,并且您希望连接到名为 test 的数据库。

如果MongoDB在别处运行,您应通过在 ‘MONGODB_SETTINGS’ 字典中提供 hostport 设置来提供 app.config

app.config['MONGODB_SETTINGS'] = {
    'db': 'project1',
    'host': '192.168.1.35',
    'port': 12345
}

如果数据库需要身份验证,应在 ‘MONGODB_SETTINGS’ 字典中提供 usernamepassword 参数 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:分页查询集。接受两个参数,pageper_page

  • paginate_field:从查询集中的单个文档分页一个字段。参数:field_namedoc_idpageper_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)

调试工具栏面板

_static/debugtoolbar.png

如果您使用 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)

致谢

灵感来自两个仓库

danjac maratfm

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

flask-mongoengine-1.0.0.tar.gz (117.7 kB 查看散列)

上传时间

构建分发

flask_mongoengine-1.0.0-py3-none-any.whl (25.7 kB 查看散列)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面