Flask create_app 不会在 init 中初始化数据库实例扩展
Flask create_app will not initializing db instance extension in init
在下面的两个代码片段中,第一个工作正常,我创建了一个连接对象,该对象在整个应用程序中被导入,但它不在 create_app() 方法中。它的全球性。但是,当我创建一个数据库 class 并尝试按照步骤在 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 数据库 class 并像其他插件一样创建一个扩展时,它没有任何错误。 这行不通
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__
您的代码段未显示 Initial_checks
的来源。
看起来它正在尝试使用 connection
作为上下文管理器。
在第一种情况下它有效,因为它传递了 psycopg2.connect
的 return 值。
在第二种情况下 (init_app) 它不起作用,因为
- 您传递的是
PostgresConnection
实例,而不是 connection
属性
connection
属性在导入时无论如何都没有设置
问题在于您在导入时调用 Initial_checks
,而您的连接只能在应用程序初始化时准备就绪。
这些检查应该推迟到初始时间。
在下面的两个代码片段中,第一个工作正常,我创建了一个连接对象,该对象在整个应用程序中被导入,但它不在 create_app() 方法中。它的全球性。但是,当我创建一个数据库 class 并尝试按照步骤在 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 数据库 class 并像其他插件一样创建一个扩展时,它没有任何错误。 这行不通
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__
您的代码段未显示 Initial_checks
的来源。
看起来它正在尝试使用 connection
作为上下文管理器。
在第一种情况下它有效,因为它传递了 psycopg2.connect
的 return 值。
在第二种情况下 (init_app) 它不起作用,因为
- 您传递的是
PostgresConnection
实例,而不是connection
属性 connection
属性在导入时无论如何都没有设置
问题在于您在导入时调用 Initial_checks
,而您的连接只能在应用程序初始化时准备就绪。
这些检查应该推迟到初始时间。