文章内容

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”字典中提供hostport设置

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

如果数据库需要身份验证, 则应在app.config中usernamepassword参数提供'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分页。接受两个参数pageper_page
  • paginate_field:从QuerySet中的一个文档分页一个字段。参数: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=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

分享到:

发表评论

评论列表