我有一个具有以下目录结构的 flask 应用程序:
- 我的应用/
- 应用程序.py
__init__.py
- 模型/
__init__.py
- 用户.py
模型使用 Flask-SQLAlchemy,因此,它们需要从 application.py
db
对象(一个 SQLAlchemy 实例)
用户.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
使用时,我不必手动更改代码。
最佳答案
第一种方法:
我最终得到了以下结构:
- project_root — 还包含一些配置、.gitignore 文件等
- 开始.py
- flask 根
- __初始化__.py
- 应用程序.py
- module_1
- __初始化__.py
- 模型.py
- module_2
- __初始化__.py
- 模型.py
最顶层的 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。
不过,通过目录布局,您可以执行以下操作:
模型/__init__.py:
from application import db
...
models/user.py:
from . import db
...
第一种方法更简洁、通用。当您需要在多个 Flask 项目之间共享相同的蓝图时,第二种可能会很有用。
关于模型的 Python 干净导入 - SQL Alchemy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11567157/