This question already has an answer here:
Import Flask extension when it is created in an app factory [duplicate]
(1个答案)
去年关闭。
我正在尝试导入数据库并收到错误“无法导入名称'db'”。我已经看到了有关此类问题的答案,但对我而言,这些答案都没有帮助。
我的项目树:
chat.py:
app \ init.py:
app \ main \ init.py:
app \ models.py:
因此,当我在python终端中尝试
ImportError:无法导入名称“ db”
由于我是不熟悉Flask(和Web的),所以我不知道该怎么办。我已经尝试过this solution(最接近我的情况),并且都给出了类似的答案,但是没有用。
我可以尝试什么?
现在
(1个答案)
去年关闭。
我正在尝试导入数据库并收到错误“无法导入名称'db'”。我已经看到了有关此类问题的答案,但对我而言,这些答案都没有帮助。
我的项目树:
chat
| chat.py
└─ app
│ models.py
│ __init__.py
│
├─── main
│ events.py
│ forms.py
│ routes.py
│ __init__.py
chat.py:
from app import create_app, socketio
app = create_app(debug=True)
if __name__ == '__main__':
socketio.run(app)
app \ init.py:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_socketio import SocketIO
socketio = SocketIO()
def create_app(debug=False):
app = Flask(__name__)
app.debug = debug
app.config['SECRET_KEY'] = 'gjr39dkjn344_!67#'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql:///site.db'
db = SQLAlchemy(app)
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
socketio.init_app(app)
return app
app \ main \ init.py:
from flask import Blueprint
main = Blueprint('main', __name__)
from . import routes, events
app \ models.py:
from app import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(15), nullable=False)
session_id = db.Column(db.String(200), nullable=False)
isready = db.Column(db.Boolean, default='False')
room = db.relationship('Room', backref='spy')
def __repr__(self):
return f"User('{self.username}')"
因此,当我在python终端中尝试
from app import db
时,我得到了ImportError:无法导入名称“ db”
由于我是不熟悉Flask(和Web的),所以我不知道该怎么办。我已经尝试过this solution(最接近我的情况),并且都给出了类似的答案,但是没有用。
我可以尝试什么?
最佳答案
db
只是create_app()
函数中的局部变量。您需要在create_app()
工厂之外创建该对象。
您可以创建Flask-SQLAlchemy db
插件对象而无需传入app
参数,并且在工厂中使用app
方法将该对象连接到te Flask .init_app()
,就像您已经为Flask- SocketIO插件:
db = SQLAlchemy()
def create_app(debug=False):
app = Flask(__name__)
app.debug = debug
app.config['SECRET_KEY'] = 'gjr39dkjn344_!67#'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql:///site.db'
db.init_app(app)
socketio.init_app(app)
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
return app
现在
db
在模块中可以作为全局变量使用,因此可以在其他位置导入。关于python - 无法导入名称“db”( flask ,sqlalchemy),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54205644/