我有一个带有以下目录结构的烧瓶应用程序:
__init__.py
__init__.py
模型使用Flask-SQLAlchemy,因此,他们需要从db
application.py
对象(SQLAlchemy实例)
user.py:
import sys,os
sys.path.append('/path/to/application/package')
from testapp import db
class User(db.Model):
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(255),unique=True)
age = db.Column(db.Integer)
def __init__(self,username,age):
self.username = username
self.age = age
def __repr__(self):
return '<User %r>' % self.username
因为任何模型都需要访问应用程序的SQLAlchemy实例db
属性,所以我必须将整个包放在路径上,然后从主应用程序模块导入。为了理智,我想将模型保存在单独的文件中。我是否需要将路径代码放在每个模型的顶部?有没有更好的办法?我宁愿没有这样的完整路径输入,因为它们可能被部署到具有不同目录结构的不同主机。理想情况下会有一些内部处理路径的方法,所以当它通过mod_wsgi
用作另一个用户时,我不必手动更改代码。
答案 0 :(得分:6)
第一种方法:
我最终得到了以下结构:
最热门的start.py只运行应用程序:
#! /usr/bin/env python
from flask_root import applicaiton
if __name__ == '__main__':
application.manager.run()
Python脚本开始的目录中的searches for packages,所以现在你不需要将它们添加到sys.path中(就我而言,修改sys.path看起来很难看)。 现在你有了完整的 flask_root python包,你可以从应用程序的任何地方导入所有内容:
from flask_root.application import db
第二种方法:
如果从其目录启动Flask应用程序,
./application.py runserver
您启动的目录无法作为python包访问,即使其中包含__init__.py。
但是,使用您的目录布局,您可以执行以下操作:
<强>模型/ __初始化__吡啶强>:
from application import db
...
<强>模型/ user.py 强>:
from . import db
...
第一种方法更干净,更普遍。当您需要在多个Flask项目之间共享相同的蓝图时,第二个可能很有用。