Using gevent

If you would like to serve your flask application using gevent, there are two small settings you will need to add.

Database configuration

Instruct peewee to store connection information in a thread local:

# app configuration
DATABASE = {
    'name': 'my_db',
    'engine': 'peewee.PostgresqlDatabase',
    'user': 'postgres',
    'threadlocals': True, # <-- this
}

Monkey-patch the thread module

Some time before instantiating a Database object (and preferrably at the very “beginning” of your code) you will want to monkey-patch the standard library thread module:

from gevent import monkey; monkey.patch_thread()

If you want to patch everything (recommended):

from gevent import monkey; monkey.patch_all()

Note

Remember to monkey-patch before initializing your app

Rationale

flask-peewee opens a connection-per-request. Flask stores things, like “per-request” information, in a special object called a context local. Flask will ensure that this works even in a greened environment. Peewee does not automatically work in a “greened” environment, and stores connection state on the database instance in a local. Peewee can use a thread local instead, which ensures connections are not shared across threads. When using peewee with gevent, it is necessary to make this “threadlocal” a “greenlet local” by monkeypatching the thread module.