Skip to content

Commit

Permalink
Merge pull request #60 from fenngwd/fix/flask
Browse files Browse the repository at this point in the history
fix(flask): construct a proxy to connection
  • Loading branch information
fenngwd authored Sep 10, 2021
2 parents 0778dd1 + 7386d7d commit e39c3f9
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 3 deletions.
2 changes: 1 addition & 1 deletion peeweext/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = '1.2.4'
__version__ = '1.2.5'
16 changes: 14 additions & 2 deletions peeweext/flask.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,32 @@
from playhouse import db_url


class UninitializedException(Exception):
pass


class Peeweext:
def __init__(self, ns='PW_'):
self.ns = ns
self._database = None
# make a connection pool proxy
self.database = LocalProxy(self._get_db)

def init_app(self, app):
config = app.config.get_namespace(self.ns)
self.model_class = import_string(
config.get('model', 'peeweext.model.Model'))
conn_params = config.get('conn_params', {})
self.database = db_url.connect(config['db_url'], **conn_params)

# initialize private connection pool
self._database = db_url.connect(config['db_url'], **conn_params)

self._register_handlers(app)

def _get_db(self):
return self.database
if not self._database:
raise UninitializedException()
return self._database

@cached_property
def Model(self):
Expand Down
29 changes: 29 additions & 0 deletions tests/test_flask.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import peewee
import pytest
from flask import Flask

import peeweext.flask
from peeweext.flask import Peeweext
from .flaskapp import app, pwmysql, PW_MYSQL_DB_URL


Expand Down Expand Up @@ -37,3 +40,29 @@ def test_flask_init_app_duplicate():
assert pwmysql.database.is_closed()
finally:
Comment.drop_table()


__inner_db = pwmysql._database
_db = pwmysql.database


def test_flask_module_load_not_cache_pool():
app1 = Flask("other app")
app1.config.setdefault("PW_MYSQL_DB_URL", PW_MYSQL_DB_URL)

# init_app to other app will update instance's database connection pool
pwmysql.init_app(app1)

# after init_app again, inner connection pool will change
assert pwmysql._database != __inner_db

# after init_app again, pub connection pool won't change
assert pwmysql.database == _db

# test before/after request works fine
assert pwmysql.database.is_closed()

pwu = Peeweext(ns='PW_MYSQL_')

with pytest.raises(peeweext.flask.UninitializedException) as e:
pwu.database.execute_sql("select 1")

0 comments on commit e39c3f9

Please sign in to comment.