[英]Flask.g database connection - RuntimeError: Working outside of application context
我正在尝试将数据库连接分配给Flask
。 g
以便在我的整个应用程序中都可以访问它。
但是我收到错误:
RuntimeError: Working outside of application context.
文件app/database/__init__.py
from flask import current_app, g
from .connection import Connection
class Database:
def __init__(self, app):
if 'db' not in g:
g.db = Connection(app)
def get(self):
if 'db' in g:
return g.db
else:
g.db = Connection(current_app)
return g.db
文件app/database/connection.py
import psycopg2
import psycopg2.extras
from ..error import DatabaseConnectionFailed
class Connection:
connection = None
cursor = None
def __init__(self, app):
self.connect(app)
def connect(self, app):
try:
self.connection = psycopg2.connect(
user=app.config['APP_DB_PSQL_USER'],
password=app.config['APP_DB_PSQL_PASSWORD'],
host=app.config['APP_DB_PSQL_HOST'],
port=app.config['APP_DB_PSQL_PORT'],
database=app.config['APP_DB_PSQL_DATABASE'],
application_name=self.client(app)
)
self.connection.autocommit = True
self.cursor = self.connection.cursor(cursor_factory=psycopg2.extras.DictCursor)
except (psycopg2.NotSupportedError, psycopg2.ProgrammingError, psycopg2.DataError, psycopg2.IntegrityError, psycopg2.InternalError, psycopg2.OperationalError, psycopg2.DatabaseError, Exception) as e:
raise DatabaseConnectionFailed()
else:
logging.warning('Connected successfully to database!')
app/__init__.py
from flask import Flask, jsonify, request, redirect
from .database import Database
def create_app(settings):
app = Flask(__name__)
app.config.from_object(settings)
Database(app)
当您在应用程序工厂中创建Database()
object 时,您正在添加到g.db
的连接,正如您所指出的。 但是g
绑定到当前应用程序上下文。 这是一个问题,因为...
根据需要创建和销毁应用程序上下文。 当 Flask 应用程序开始处理请求时,它会推送应用程序上下文和请求上下文。 当请求结束时,它会弹出请求上下文,然后是应用程序上下文。 通常,应用程序上下文与请求具有相同的生命周期。
https://flask.palletsprojects.com/en/1.1.x/appcontext/#lifetime-of-the-context
与其将连接存储在g
中,不如将其存储在 python 变量中,该变量可从应用程序的其他部分导入。
例如,在名为database.py
的文件中创建Database()
object 并将其存储在变量中。 添加然后将其导入您的应用程序工厂并在工厂中调用connect
。
然后在您需要数据库的任何地方,从database.py
导入它。
还可以查看Flask-SQLAlchemy
项目,因为它是一种更好的方式来做你想做的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.