文章内容
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
评论列表