Python Flask create_应用程序将不会在init中初始化db实例扩展

Python Flask create_应用程序将不会在init中初始化db实例扩展,python,postgresql,flask,psycopg2,Python,Postgresql,Flask,Psycopg2,在下面的两个代码段中,第一个很好地工作,我创建了一个连接对象,该对象在应用程序之外导入,但不在create_app()方法中。它是全球性的。但是,当我创建一个DB类并尝试按照步骤在create_app()中实例化时。它不起作用,任何帮助都是感激的。 这工作非常好 import os from flask import Flask, current_app import psycopg2 from flask_bcrypt import Bcrypt from flask_login import

在下面的两个代码段中,第一个很好地工作,我创建了一个连接对象,该对象在应用程序之外导入,但不在create_app()方法中。它是全球性的。但是,当我创建一个DB类并尝试按照步骤在create_app()中实例化时。它不起作用,任何帮助都是感激的。 这工作非常好

import os
from flask import Flask, current_app
import psycopg2
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from flask_script import Manager
from flask_mail import Mail
from Flask_blog.database_queries import *
from Flask_blog.config import Config

connection = psycopg2.connect("postgres://postgres:postgres...url")
bcrypt = Bcrypt()
login_manager = LoginManager()
login_manager.login_view = 'users.login'
login_manager.login_message_category = 'info'
mail = Mail()

#to run scripts or functions at start-up
script_manager = Manager()
script_manager.add_command('setup_database', Initial_checks(connection))


def create_app(config_class=Config):

    app = Flask(__name__) #app variable being set an Instance of Flask class
    app.config.from_object(Config)

    bcrypt.init_app(app)
    login_manager.init_app(app)
    mail.init_app(app)
    script_manager(app)

    from Flask_blog.users.routes import users
    from Flask_blog.posts.routes import posts
    from Flask_blog.main.routes import main

    app.register_blueprint(users)
    app.register_blueprint(posts)
    app.register_blueprint(main)
    return app
当我尝试创建一个psycopg2 DB类并像其他插件一样创建一个扩展时,它不会出现任何错误这不起作用

import os
from flask import Flask, current_app
import psycopg2
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from flask_script import Manager
from flask_mail import Mail
from Flask_blog.database_queries import *
from Flask_blog.config import Config
    
#CREATING THIS CLASS FOR DB
class PostgresConnection(object):
    
    def __init__(self):
        self.connection = None

    def init_app(self, app):
            #self.connection = psycopg2.connect(app.config['POSTGRES_URL'])
            self.connection = psycopg2.connect("postgres://postgres:....url")

bcrypt = Bcrypt()
login_manager = LoginManager()
login_manager.login_view = 'users.login'
login_manager.login_message_category = 'info'
mail = Mail()
connection = PostgresConnection() # CREATING EXTENSION

#to run scripts or functions at start-up
script_manager = Manager()
script_manager.add_command('setup_database', Initial_checks(connection))


def create_app(config_class=Config):

    app = Flask(__name__) #app variable being set an Instance of Flask class
    app.config.from_object(Config)

    #connectioned = psycopg2.connect(app.config['POSTGRES_URL'])
    #connection = connectioned

    bcrypt.init_app(app)
    login_manager.init_app(app)
    mail.init_app(app)
    script_manager(app)
    connection.init_app(app) #####


    from Flask_blog.users.routes import users
    from Flask_blog.posts.routes import posts
    from Flask_blog.main.routes import main

    app.register_blueprint(users)
    app.register_blueprint(posts)
    app.register_blueprint(main)
    return app
我唯一的错误就是这个,我无法理解。下面的代码我以前使用过,没有问题

  File "d:\project7\Flask_blog\database_queries.py", line 6, in Run_Query
    with connection:
AttributeError: __enter__

您的代码片段不会显示
初始检查的来源

看起来它正在尝试使用
连接
作为上下文管理器

在第一种情况下,它工作是因为它被传递了
psycopg2.connect的返回值

在第二种情况下(init_app),它不起作用,因为

  • 您正在传递一个
    PostgresConnection
    实例,而不是
    connection
    属性
  • 无论如何,
    连接
    属性在导入时未设置
问题在于,您正在导入时调用
Initial\u checks
,而您的连接只能在应用程序初始化时准备就绪


这些检查应该推迟到init time。

你说得对,是脚本管理器导致了崩溃,我暂时删除了它。不需要我,我可以在注册路由中添加初始检查。非常感谢。