This question already has an answer here:
Import Flask extension when it is created in an app factory [duplicate]
                                
                                    (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/

10-12 16:52
查看更多