如何避免在 Flask 应用程序中使用 Flask SQLAlchemy 模型进行循环导入?

hid*_*ace 8 python flask flask-sqlalchemy

我正在使用 Flask 并构建一个使用 Flask SQLAlchemy 的应用程序。我创建了一个基本的 API,当所有代码都在一个文件中时,它可以工作,但希望更好地组织它,如下所示:

应用程序/模型/user.py

from datetime import datetime
from app.app import db


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    public_id = db.Column(db.String, unique=True)
    admin = db.Column(db.Boolean)
    username = db.Column(db.String(50), unique=True)
    email = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(100))
    subscription_plan = db.Column(db.Integer)
    created_at = db.Column(db.DateTime, index=True,
                           default=datetime.utcnow())
    updated_at = db.Column(db.DateTime, index=True, default=datetime.utcnow())
Run Code Online (Sandbox Code Playgroud)

应用程序/应用程序.py

from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash
import uuid

from app.models.user import User

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = #SQLALCHEMY_DATABASE_URI

db = SQLAlchemy(app)

# ... CRUD routes that will use User

@app.route('/user', methods=['POST'])
def create_user():
data = request.get_json()
hashed_password = generate_password_hash(data['password'])
new_user = User(
    public_id=str(uuid.uuid4()),
    username=data['username'],
    password=hashed_password,
    email=data['email'],
    admin=data['admin'],
    subscription_plan=data['subscription_plan']
)
db.session.add(new_user)
db.session.commit()
return jsonify({'message': 'User successfully created.'})


if __name__ == '__main__':
    app.run(port=5000, debug=True)
Run Code Online (Sandbox Code Playgroud)

我想dbapp/app.py导入到我的app/models/user.py文件中,但是当我尝试将User模型导入app/app.py 时,由于循环导入,它给了我一个错误。我不知道如何解决这个问题,因为在它传递了from app/app.py的实例后似乎User需要。dbapp

我还想将我的路线从这里移到单独的文件中以便更好地组织,因此试图了解避免循环导入的最佳方法。非常感谢任何和所有帮助!

hel*_*rld 7

不是让 User import app 和 app import user ,而是将它们放在一起init

应用程序/应用程序.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)
Run Code Online (Sandbox Code Playgroud)

应用程序/模型/user.py

from app.app import db
class User:
    pass #access db the way you want
Run Code Online (Sandbox Code Playgroud)

应用程序/视图.py

from app.app import app,db
@app.route("/")
def home():
    return "Hello World" # use db as you want
Run Code Online (Sandbox Code Playgroud)

应用程序/__init__.py

from app import app
from app.models.user import User
from app import views
Run Code Online (Sandbox Code Playgroud)

这是解决问题的最精简的方法。但是,我建议使用应用程序工厂