干杯家伙,我重构应用瓶我被困在追平了DB连接到@app.before_request
和@app.teardown_appcontext
关闭它。我使用的平原Psycopg2和应用工厂模式。
首先,我创建了一个功能到应用程序工厂内调用,所以我可以用@app为qazxsw POI:
suggested by Miguel Grinberg here
然后我尝试这种模式的def create_app(test_config=None):
app = Flask(__name__, instance_relative_config=True)
--
from shop.db import connect_and_close_db
connect_and_close_db(app)
--
return app
建议:
http://flask.pocoo.org/docs/1.0/appcontext/#storing-data
这导致:
def connect_and_close_db(app):
@app.before_request
def get_db_test():
conn_string = "dbname=testdb user=testuser password=test host=localhost"
if 'db' not in g:
g.db = psycopg2.connect(conn_string)
return g.db
@app.teardown_appcontext
def close_connection(exception):
db = g.pop('db', None)
if db is not None:
db.close()
任何人有一个想法发生了什么,以及如何使其工作?
此外,我不知道我会如何访问连接对象,一旦它的创作是联系在一起TypeError: 'psycopg2.extensions.connection' object is not callable
创建光标?
这种解决方案可能是完美远,这不是真干。我欢迎大家提出意见,或者说建立在这个答案。
为了实现对原材料before_request
支持,你可能需要采取看看psycopg2
。还有关于如何实现这一outwith烧瓶内的connection pooler。
其基本思路是先建立连接池。你要这个当烧瓶应用程序初始化要建立(这可以在Python解释器内或通过gunicorn工人,其中可能有几种 - 在这种情况下,每个工人都有自己的连接池)。我选择存储在配置返回池:
good guide
注意前两个参数from flask import Flask, g, jsonify
import psycopg2
from psycopg2 import pool
app = Flask(__name__)
app.config['postgreSQL_pool'] = psycopg2.pool.SimpleConnectionPool(1, 20,
user = "postgres",
password = "very_secret",
host = "127.0.0.1",
port = "5432",
database = "postgres")
是SimpleConnectionPool
&min
连接。这就是要去连接到数据库服务器,bwtween max
&1
在这种情况下的数量。
接下来定义20
功能:
get_db
这里使用的def get_db():
if 'db' not in g:
g.db = app.config['postgreSQL_pool'].getconn()
return g.db
方法简单地返回从池中,我们分配给SimpleConnectionPool.getconn()
并返回一个连接。这意味着,当我们在代码中任何地方调用g.db
返回相同的连接,或者创建如果不存在的连接。有没有必要为一个get_db()
装饰。
请确定您拆卸功能:
before.context
这个运行时应用程序上下文被破坏,并使用@app.teardown_appcontext
def close_conn(e):
db = g.pop('db', None)
if db is not None:
app.config['postgreSQL_pool'].putconn(db)
放好连接。
最后定义路由:
SimpleConnectionPool.putconn()
此代码的工作对我来说打击泊坞窗容器中运行的Postgres测试。有几件事情这可能应加以改进:
@app.route('/')
def index():
db = get_db()
cursor = db.cursor()
cursor.execute("select 1;")
result = cursor.fetchall()
print (result)
cursor.close()
return jsonify(result)
功能,所以它返回一个指针。 (!!!)get_db
连接(!),在另一片土地,在app.config['postgreSQL_pool'].closeall
sqlalchemy.scoped_session
解释关于这个更多的东西,对有关请求是如何它的“会话”工作的一些理论。他们以这样的方式,你可以打电话documentation,如果它不存在,它会创建会话来实现它。
编辑:这是您的应用工厂模式的Session.query('SELECT 1')
,并在注释中使用范例。