Long ago, when I worked at MongoDB I created
Flask-PyMongo to make it
easy for programmers using Flask to use the
database. Fast forward almost 8 years, during which time I wasn’t a
consistent user of either Flask or MongoDB, and Flask-PyMongo has fallen
MongoDB, PyMongo, and Flask have moved on, and Flask-PyMongo hasn’t been
kept up to date. There are more than twice as many forks as pull requests, a
GitHub ratio I’m not proud of.
Fotunately, the future for Flask-PyMongo is bright.
At PyCon US 2017, I first had the idea to restore Flask-PyMongo. PyCon
always has this effect on me, but sadly the effect is often short lived. In
2017, I got as far as mentioning plans for a 2.0
but did not go into any detail, nor begin to make any progress toward that
This year at PyCon 2018, I once again had the urge to work on Flask-PyMongo.
I had the same conversation with Jesse,
decided, again, to jump from 0.x to 2.0, and even came up with the same
technical plan as the previous year (about which more below). All without
realizing that I had been down this road once before.
I can now confidently say that Flask-PyMongo 2.0 is (soon to be) a real
thing, and it will set the stage for easier maintainability into the future
and a better experience for users and contributors. Flask-PyMongo 2.0 will
be released in early July, and pre-release versions are available
Flask-PyMongo 2.0 is not backwards compatible!
A lot of the historical problems with Flask-PyMongo have cenetered on the
confusing and difficult configuration system. Originally, I envisioned that
users would want configuration abstracted from PyMongo itself, and created a
system where you could set Flask configurations for
MONGO_DBNAME, and be off to the races. For a while this
worked, and many users seemed to like it. Unfortunately, there are quite a
lot of configuration options for PyMongo, so the list of configurations
PyMongo and MongoDB are under active development, and grow and lose features
over time. Attempts to make Flask-PyMongo version-agnostic added tremendous
complexity to the configuration system, and evidently frustrated many users
over the years.
In any event, it turns out that there’s a better way to configure PyMongo —
hosted PyMongo services already provide configuration information in exactly
this format. Going forward in 2.0, MongoDB URIs are the preferred
configuration method for Flask-PyMongo. Flask-PyMongo will only look for or
respect a single Flask configuration variable,
If you prefer, you may also pass positional and keyword arguments directly
to Flask-PyMongo, which will be passed through to the underlying PyMongo
Flask-PyMongo no longer supports configurating multiple instances via Flask
configuration. If you wish to use multiple Flask-PyMongo instances, you must
configure at least some of them using a URI or direct argument passing.
Flask-PyMongo 2.0 also clarifies the support policy for versions of Flask,
PyMongo, MongoDB, and Python that are supported. For Flask and PyMongo, it
supports “recent” versions — those versions with releases in the preceding
3 years (give or take). For MongoDB, we follow the MongoDB server support
policy, and support versions that
are not end-of-lifed. For Python, we support 2.7 for as long as it is
supported by the CPython core maintainers; and the most recent 3 versions of
the 3.x series. For an exact list of supported versions and combinations,
see the build
If you are a Flask-PyMongo user and you are using the 0.x series, you should
immediately pin a particular version. Flask-PyMongo 2.0 is not backwards
compatible, so you should take steps to ensure that you don’t accidentally
break your application.
If you are already using a URI for Flask-PyMongo configuration, or if that
is an easy change for you, I would appreciate if you could upgrade, test
compatibility, and report any issues on
GitHub. You can install
Flask-PyMongo 2.0 pre-releases with
pip install --pre flask-pymongo. You
may also want to follow the general discussion and release notices in
I also hope for Flask-PyMongo to be a place that supports Flask and MongoDB
with more than just connection assistance. Please suggest ideas and propose