Flask-PyMongo, Back from the Dead
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 into disrepair.
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.
False Starts and New Beginnings
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 release, but did not go into any detail, nor begin to make any progress toward that goal.
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 today.
What's Changing
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_HOST
,
MONGO_PORT
, and 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
grew. Worse,
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 --
with MongoDB
URIs. Most
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, MONGO_URI
.
If you prefer, you may also pass positional and keyword arguments directly
to Flask-PyMongo, which will be passed through to the underlying PyMongo
MongoClient
object.
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 matrix.
What You Should Do
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
issue #110.
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 contributions!