Python模型的干净导入-SQL Alchemy
我有一个具有以下目录结构的flask应用程序:Python模型的干净导入-SQL Alchemy,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,我有一个具有以下目录结构的flask应用程序: myapp/ application.py \uuuu init\uuuuu.py 模型/ \uuuu init\uuuuu.py user.py 这些模型使用Flask SQLAlchemy,因此,它们需要从application.py访问db对象(SQLAlchemy实例) user.py: import sys,os sys.path.append('/path/to/application/package') from tes
- myapp/
- application.py
\uuuu init\uuuuu.py
- 模型/
\uuuu init\uuuuu.py
- user.py
application.py
访问db
对象(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
导入系统,操作系统
sys.path.append('/path/to/application/package')
从testapp导入数据库
类用户(db.Model):
id=db.Column(db.Integer,主键=True)
username=db.Column(db.String(255),unique=True)
年龄=分贝列(分贝整数)
定义初始(自我、用户名、年龄):
self.username=用户名
self.age=年龄
定义报告(自我):
返回“%self.username”
因为任何模型都需要访问应用程序的SQLAlchemy实例,db
属性,所以我必须将整个包抛出路径,然后从主应用程序模块导入。为了理智起见,我想将模型保存在单独的文件中。我是否需要将路径代码放在每个模型的顶部?有更好的办法吗?我不希望有这样的完整路径输入,因为它们可能被部署到具有不同目录结构的不同主机上。理想情况下,可以通过某种方式在内部处理路径,这样当它通过mod\u wsgi
作为另一个用户使用时,我不必手动更改代码。第一种方法:
我最终得到了以下结构:
- project\u root-还保存一些配置、.gitignore文件等
- start.py
- flask_根
- __初始值
- application.py
- 模块_1
- __初始值
- models.py
- 模块2
- __初始值
- models.py
#! /usr/bin/env python
from flask_root import applicaiton
if __name__ == '__main__':
application.manager.run()
Python位于您编写脚本的起始目录中,因此现在不需要将它们添加到sys.path(对我来说,修改sys.path看起来很难看)。
现在您拥有了完整的工作flask\u rootpython包,您可以从应用程序的任何位置导入其中的所有内容:
from flask_root.application import db
第二种方法: 如果您从Flask应用程序的目录启动它
./application.py runserver
您从中启动的目录不能作为python包访问,即使其中包含_init__;.py
不过,使用目录布局,您可以执行以下操作:
型号/\uuuuu初始.py:
from application import db
...
from . import db
...
型号/user.py:
from application import db
...
from . import db
...
第一种方法更干净、更普遍。当您需要在多个Flask项目之间共享相同的蓝图时,第二个可能很有用。我喜欢!一个问题。。。如果我在
\uuuu main\uuuu
条件中的每个模型文件中都有测试逻辑,那么它们可能不会使用这种方法运行。我应该用start将单元测试放在根目录中,对吗?您可以使用Flask脚本扩展,您的测试将通过./application.py提供。将测试代码留在它的模块中(对于小型测试,它会更好、更简单),但将它与Flask脚本的decorator一起放入函数中,它将创建一个命令。。。您还可以创建一个decorator,它将测试函数添加到一些全局列表中,以便一次(通过命令或仅在调试模式下启动时)运行它们。