繁体   English   中英

Flask.g 数据库连接 - RuntimeError:在应用程序上下文之外工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM