我可以在Flask和SQLAlchemy中避免循环导入

ovg*_*ovg 18 python flask flask-sqlalchemy

app/init .py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__ name __)
db = SQLAlchemy(app)  
from app import views, models
Run Code Online (Sandbox Code Playgroud)

应用程序/ models.py:

from app import db  # I want to avoid this everywhere
Run Code Online (Sandbox Code Playgroud)

我真的不喜欢我的子模块依赖于他们的父级.也可以避免全局包变量吗?我想要更多的OO解决方案.

app的一个替代方案是使用我认为的蓝图,但随后我松开了路径装饰器.对于带有SQLAlchemy的db也是如此(或者可以吗?).

leo*_*ovp 30

看看这个项目:https://github.com/sloria/cookiecutter-flask
这是以正确的方式做事的一个很好的例子.使用了许多伟大的Flask功能:蓝图,应用工厂等.

以下是他们如何注册扩展,例如SQLAlchemy数据库:

# app/extensions.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
...


# app/app.py
from app.extensions import db

def create_app(config_object=ProdConfig):
    app = Flask(__name__.split('.')[0])
    app.config.from_object(config_object)
    register_extensions(app)
    ...

def register_extensions(app):
    db.init_app(app)
    ...
Run Code Online (Sandbox Code Playgroud)

  • 我花了很长时间才按照我想要的方式设置 Flask。这非常有帮助。非常感谢。 (4认同)

Leg*_*oom 5

尝试使用3rd。我们创建exts.py文件来实例化SQLAlchemy,如下所示:

exts.py

from flask_sqlalchemy import SQLAlchemy
from flask_xxx import xxx

db = SQLAlchemy()
...
Run Code Online (Sandbox Code Playgroud)

运行

from flask import Flask

from .exts import db, ...


def register_extensions(app):
    db.init_app(app) 
    ... 


def create_app(config):
    app = Flask(__ name __)
    app.config.from_object(config)

    register_extensions(app)

    return app

app = create_app(config)
Run Code Online (Sandbox Code Playgroud)

models.py

from .exts import db


class XXXModel(db.Model):
    pass    
Run Code Online (Sandbox Code Playgroud)

  • 但是在哪里写`db.create_all()`。 (2认同)