python - Flask - 使用应用工厂避免循环导入
问题描述
我flask
以这样一种方式构建了我的应用程序,即应用程序工厂将所有__init__.py
文件统一到一个app
对象中,如下所示:
app.py
tasks.py
/project/
__init__.py
routes/
__init__.py
auth_bp.py
register_bp.py
models/
__init__.py
user.py
base.py
应用程序.py
from project import create_app
app = create_app()
项目/__init__.py
from flask import Flask
def create_app():
from . import routes, models
app = Flask(__name__)
models.init_app(app)
routes.init_app(app)
return app
项目/模型/__init__,py
from base import db
def init_app(app):
db.init_app(app)
项目/路线/__init__.py
from auth import auth_bp
from register import register_bp
def init_app(app):
app.register_blueprint(auth_bp)
app.register_blueprint(register_bp)
我想要解决的是如何构建一些依赖于的后台进程app.context()
,如下所示:
项目/tasks.py
import sys
sys.path.append('/path/to/root')
from app import app
def load_cache(track_and_features):
while True:
with app.app_context():
Upload_Track(track_and_features)
@app.route('/cache')
def cache(track_and_features):
executor.submit(load_cache, track_and_features)
return 'Ok'
问题(我猜)发生在这里,当我调用时,在轮流cache()
导入对象的模块中:app
项目/路线/auth_bp.py
from tasks import cache
@auth_bp.route("/callback/q")
def callback():
(...)
cache()
return redirect(url_for('register.homepage'))
我收到错误消息:
File "app.py", line 6, in <module>
app = create_app()
File "/Users/me/Documents/Code/Apps/Production/project/__init__.py", line 20, in create_app
from . import routes
File "/Users/me/Documents/Code/Apps/Production/project/routes/__init__.py", line 1, in <module>
from auth import auth_bp
File "/Users/me/Documents/Code/Apps/Production/project/routes/auth.py", line 18, in <module>
from tasks import cache
File "/Users/me/Documents/Code/Apps/Production/tasks.py", line 4, in <module>
from app import app
File "/Users/me/Documents/Code/Apps/Production/app.py", line 6, in <module>
app = create_app()
File "/Users/me/Documents/Code/Apps/Production/project/__init__.py", line 20, in create_app
from . import models, routes, services
ImportError: cannot import name routes
我该如何解决?
解决方案
不要导入app
. routes
使用应用工厂,您无需app
在工厂外注册路线。相反,为所有视图使用蓝图,并将蓝图导入工厂。您仍然可以使用app
factory 中的对象注册您的视图,但这并不像使用蓝图注册视图那么干净。
您已经使用专用init_app()
函数执行此操作,但您的project/routes/tasks.py
模块不遵循此模式。它也应该使用蓝图。如果可以简化您的应用程序,您可以在模块之间共享蓝图。
您实际创建app
名称的唯一一点是运行整个应用程序,因此对于 WSGI 服务器、测试或命令行工具。
推荐阅读
- javascript - 使用 HTML5 Canvas 呈现时如何消除文本的边缘?
- node.js - 从查询的顶级模型检查关联模型
- android - kotlin 中的回收站查看项目点击监听器
- python - for 循环在 for 循环中给出关键错误我正在给出列表
- c# - MaskedTextBox 在 C# 中进行验证
- c++ - c++ Qt中的计算属性
- php - 查询数据和排列数据 Laravel
- javascript - Response.Redirect(" ") 或 window.location=""
- php - Laravel 雄辩的构建查询
- c++ - 为什么我的 lambda 函数没有被执行?