Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python模型的干净导入-SQL Alchemy_Python_Flask_Flask Sqlalchemy - Fatal编程技术网

Python模型的干净导入-SQL Alchemy

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

我有一个具有以下目录结构的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 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
Topmost start.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,它将测试函数添加到一些全局列表中,以便一次(通过命令或仅在调试模式下启动时)运行它们。