Psycopg2&瓶 - 搭售连接before_request&teardown_appcontext

问题描述 投票:1回答:1

干杯家伙,我重构应用瓶我被困在追平了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 创建光标?

flask psycopg2
1个回答
0
投票

这种解决方案可能是完美远,这不是真干。我欢迎大家提出意见,或者说建立在这个答案。

为了实现对原材料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") SimpleConnectionPoolmin连接。这就是要去连接到数据库服务器,bwtween max1在这种情况下的数量。

接下来定义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) 功能,所以它返回一个指针。 (!!!)
  • 在Python解释器退出时,你也应该找到除了爱情之外,以缩小与get_db连接
  • 虽然测试某种方式来监控池将是一件好事,这样你就可以观看载荷下泳池/ DB连接,确保池程序行为与预期相同。

(!),在另一片土地,在app.config['postgreSQL_pool'].closeall sqlalchemy.scoped_session解释关于这个更多的东西,对有关请求是如何它的“会话”工作的一些理论。他们以这样的方式,你可以打电话documentation,如果它不存在,它会创建会话来实现它。


编辑:这是您的应用工厂模式的Session.query('SELECT 1'),并在注释中使用范例。

© www.soinside.com 2019 - 2024. All rights reserved.