如何解决将flask应用程序转换为应用程序工厂模式会破坏所有导入
因此,我一直在使用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模式
资源/period.py
#THESE ARE NO LONGER IMPORTED SUCCESSFULLY
from models.project import ProjectModel
from schemas.task import TaskSchema
from schemas.period import PeriodSchema
解决方法
由于您是使用相对导入方式从resources/period.py
进行导入的,因此您需要进行以下操作:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。