python - 将烧瓶应用程序转换为应用程序工厂模式会破坏所有导入
问题描述
所以我一直在构建一个烧瓶应用程序,只使用一个app.py
文件并运行它。它现在有一个相当大的应用程序,我现在只是想把它转换成一个应用程序工厂,因为我需要在我的 Celery 任务中使用 SQLAlchemy。
这是我的应用程序文件夹中的init .py
def create_app():
load_dotenv(".env")
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///data.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["PROPAGATE_EXCEPTIONS"] = True
app.config["BROKER_URL"] = os.getenv("REDIS_BACKEND_BROKER")
app.config["CELERY_BROKER_URL"] = os.getenv("REDIS_BACKEND_BROKER")
app.config["CELERY_IMPORTS"] = "celery_tasks"
app.secret_key = os.getenv("SECRET_KEY")
CORS(app)
api = Api(app)
jwt = JWTManager(app)
db.init_app(app)
ma.init_app(app)
celery.init_app(app)
@app.before_first_request
def create_tables():
db.create_all()
@jwt.invalid_token_loader
def invalid_token_callback(self):
return {"message": "invalid"}, 401
with app.app_context():
from .resources.auth import Auth, CheckUser
from .resources.period import Period
from .resources.project import Project
from .resources.session import Session
api.add_resource(Auth, "/auth")
api.add_resource(CheckUser, "/check")
api.add_resource(Project, "/createproject")
api.add_resource(Period, "/createperiod")
api.add_resource(Session, "/createsession")
return app
问题是所有正在导入的资源都会中断,因为它们也不能再基于模块导入。
例如 resources.period 还导入 SQLAlchemy 模型和 Masrhmallow 模式
资源/期间.py
#THESE ARE NO LONGER IMPORTED SUCCESSFULLY
from models.project import ProjectModel
from schemas.task import TaskSchema
from schemas.period import PeriodSchema
解决方案
这是 Miguel Grinberg 的一个很棒的教程,他在其中重构了一个完整的应用程序,就像你想要的那样:
https://www.youtube.com/watch?v=NH-8oLHUyDc&t=2934s
您是否尝试过进行“绝对”导入,例如:
from app.models.project import ProjectModel
推荐阅读
- python - OWL2,SWRL:查询项目是否在另一个项目的范围内?
- javascript - 在 BigQuery 函数中使用外部 Javascript 库?
- java - 如何使用数组列表存储坐标以在固定区域内绘制不同颜色的随机点?
- autohotkey - 使用 A_Index 或变量作为函数参数
- javascript - 如何在 JavaScript 教育应用程序中安全地使用 eval()?
- c# - 与 linq 中的 where 子句左连接
- javascript - Javascript 不允许我获取对象的值
- amazon-web-services - 更改了 API-server 清单文件,但未实施更改
- excel - 如何删除标题中没有指定单词的所有列?
- php - 如何从 Piwigo 中删除 index.php 和 picture.php?