====== Flask MongoEngine ====== ===== Basic usage ===== ==== Install ==== pip install flask-mongoengine ==== Setting up the DB ==== from flask import Flask from flask.ext.mongoengine import MongoEngine app = Flask(__name__) app.config.from_pyfile('the-config.cfg') db = MongoEngine(app) Or, if you are setting up your database before your app is initialized.... from flask import Flask from flask.ext.mongoengine import MongoEngine db = MongoEngine() ... app = Flask(__name__) app.config.from_pyfile('the-config.cfg') db.init_app(app) ==== Configuration ==== app.config['MONGODB_SETTINGS'] = { 'db': 'project1', 'host': '192.168.1.35', 'port': 12345, 'username':'webapp', 'password':'pwd123' } 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' ==== Model ==== from app import db class Post(db.Document): created_at = db.DateTimeField(default=datetime.datetime.now, required=True) title = db.StringField(max_length=255, required=True) slug = db.StringField(max_length=255, required=True) body = db.StringField(required=True) comments = db.ListField(db.EmbeddedDocumentField('Comment')) def get_absolute_url(self): return url_for('post', kwargs={"slug": self.slug}) def __unicode__(self): return self.title meta = { 'allow_inheritance': True, 'indexes': ['-created_at', 'slug'], 'ordering': ['-created_at'] } ==== Use ==== Flask MongoEngine attaches methods to MongoEngine: * get_or_404: works like .get(), but calls abort(404) if the object DoesNotExist. * first_or_404: same as above, except for .first(). * paginate: paginates the QuerySet. Takes two arguments, page and per_page. * paginate_field: paginates a field from one document in the QuerySet. Arguments: 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) You can use them in templates: {% macro render_pagination(pagination, endpoint) %} {% endmacro %} ===== Other uses ===== ==== Session storage ==== To use MongoEngine as your session store simple configure the session interface: from flask.ext.mongoengine import MongoEngine, MongoEngineSessionInterface app = Flask(__name__) db = MongoEngine(app) app.session_interface = MongoEngineSessionInterface(db) ==== Debug Toolbar Panel ==== If you use the Flask-DebugToolbar you can add ‘flask.ext.mongoengine.panels.MongoDebugPanel’ to the DEBUG_TB_PANELS config list and then it will automatically track your queries. from flask import Flask from flask_debugtoolbar import DebugToolbarExtension app = Flask(__name__) app.config[‘DEBUG_TB_PANELS’] = [‘flask.ext.mongoengine.panels.MongoDebugPanel’] db = MongoEngine(app) toolbar = DebugToolbarExtension(app)