Skip to main content

Flask-MongoEngine

A Flask extension that provides integration with MongoEngine. For more information on MongoEngine please check out the MongoEngine Documentation.

It handles connection management for your app. You can also use WTForms as model forms for your models.

Pre-requisite

Make sure you have wheel installed:

pip install wheel

Installing Flask-MongoEngine

Install with pip:

pip install flask-mongoengine

Configuration

Basic setup is easy, just fetch the extension:

from flask import Flask
from flask_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, as is the case with application factories:

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)

By default, Flask-MongoEngine assumes that the mongod instance is running on localhost on port 27017, and you wish to connect to the database named test.

If MongoDB is running elsewhere, you should provide the host and port settings in the ‘MONGODB_SETTINGS’ dictionary wih app.config.:

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

If the database requires authentication, the username and password arguments should be provided ‘MONGODB_SETTINGS’ dictionary wih app.config.:

app.config['MONGODB_SETTINGS'] = {
    'db': 'project1',
    'username':'webapp',
    'password':'pwd123'
}

Uri style connections are also supported, just supply the uri as the host in the ‘MONGODB_SETTINGS’ dictionary with app.config. Note that database name from uri has priority over name. If uri presents and doesn’t contain database name db setting entirely ignore and db name set to ‘test’.

app.config['MONGODB_SETTINGS'] = {
    'db': 'project1',
    'host': 'mongodb://localhost/database_name'
}

Connection settings may also be provided individually by prefixing the setting with ‘MONGODB_’ in the app.config.:

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'

By default flask-mongoengine open the connection when extension is instanciated but you can configure it to open connection only on first database access by setting the MONGODB_SETTINGS['connect'] parameter or its MONGODB_CONNECT flat equivalent to False:

app.config['MONGODB_SETTINGS'] = {
    'host': 'mongodb://localhost/database_name',
    'connect': False,
}
# or
app.config['MONGODB_CONNECT'] = False

Custom Queryset

flask-mongoengine attaches the following methods to Mongoengine’s default QuerySet:

  • get_or_404: works like .get(), but calls abort(404) if the object DoesNotExist. Optional arguments: message - custom message to display.

  • first_or_404: same as above, except for .first(). Optional arguments: message - custom message to display.

  • 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.

Examples:

# 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)

Properties of the pagination object include: iter_pages, next, prev, has_next, has_prev, next_num, prev_num.

In the template:

{# 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 and WTForms

flask-mongoengine automatically generates WTForms from MongoEngine models:

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)

For each MongoEngine field, the most appropriate WTForm field is used. Parameters allow the user to provide hints if the conversion is not implicit:

PostForm = model_form(Post, field_args={'title': {'textarea': True}})

Supported parameters:

For fields with choices:

  • multiple to use a SelectMultipleField

  • radio to use a RadioField

For StringField:

  • password to use a PasswordField

  • textarea to use a TextAreaField

For ListField:

  • min_entries to set the minimal number of entries

(By default, a StringField is converted into a TextAreaField if and only if it has no max_length.)

Supported fields

  • StringField

  • BinaryField

  • URLField

  • EmailField

  • IntField

  • FloatField

  • DecimalField

  • BooleanField

  • DateTimeField

  • ListField (using wtforms.fields.FieldList )

  • SortedListField (duplicate ListField)

  • EmbeddedDocumentField (using wtforms.fields.FormField and generating inline Form)

  • ReferenceField (using wtforms.fields.SelectFieldBase with options loaded from QuerySet or Document)

  • DictField

Not currently supported field types:

  • ObjectIdField

  • GeoLocationField

  • GenericReferenceField

Session Interface

To use MongoEngine as your session store simple configure the session interface:

from flask_mongoengine import MongoEngine, MongoEngineSessionInterface

app = Flask(__name__)
db = MongoEngine(app)
app.session_interface = MongoEngineSessionInterface(db)

Debug Toolbar Panel

_static/debugtoolbar.png

If you use the Flask-DebugToolbar you can add ‘flask_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_mongoengine.panels.MongoDebugPanel']
db = MongoEngine(app)
toolbar = DebugToolbarExtension(app)

Upgrading

0.6 to 0.7

ListFieldPagination order of arguments have been changed to be more logical:

# 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)

Credits

Inspired by two repos:

danjac maratfm

Release files for flask-mongoengine 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for flask-mongoengine 1.0.0
File Size Uploaded
flask-mongoengine-1.0.0.tar.gz 117.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for flask-mongoengine 1.0.0
File Interpreter ABI Platform
flask_mongoengine-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 143.4 kB

Release files / flask-mongoengine-1.0.0.tar.gz

Download URL flask-mongoengine-1.0.0.tar.gz
Size 117.7 kB
Tags Source
SHA-256 checksum
How to use checksums
ce68726d2be8d88006e88f17e4be3b7ad07c79ca8dedb60653d3dab5d9485840
BLAKE2b-256 checksum
How to use checksums
407a415fa435493ec113edcdc5d0568f5167b06e8d1d878d73b2d2e2d9d41c7f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.52.0 CPython/3.6.10

Release files / flask_mongoengine-1.0.0-py3-none-any.whl

Download URL flask_mongoengine-1.0.0-py3-none-any.whl
Size 25.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2db13140ce7f61a935e75268190450d5ecc9b60a7310fd289f9511835aa105d4
BLAKE2b-256 checksum
How to use checksums
bc08cd2052b0bfb636c5e47bae31ea4b089ace44cdd0c2cc4fd800c8ff63d95f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.52.0 CPython/3.6.10

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

0.9.5

2 release files

0.9.3

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8

1 release file

0.7.5

1 release file

0.7.4

1 release file

0.7.3

1 release file

0.7.1

2 release files

0.7.0

1 release file

0.6

1 release file

0.5

1 release file

0.4

1 release file

0.3

1 release file

0.2

1 release file

0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page