【问题标题】:Python clean imports for models - SQL Alchemy模型的 Python 干净导入 - SQL Alchemy
【发布时间】:2012-07-19 00:15:09
【问题描述】:

我有一个具有以下目录结构的烧瓶应用程序:

  • 我的应用程序/
    • application.py
    • __init__.py
    • 型号/
      • __init__.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 

因为任何模型都需要访问应用程序的 SQLAlchemy 实例,db 属性,所以我必须将整个包放在路径上,然后从主应用程序模块导入。为了理智起见,我想将模型保存在单独的文件中。我需要将路径代码放在每个模型的顶部吗?有没有更好的办法?我宁愿没有这样的完整路径输入,因为它们可能被部署到具有不同目录结构的不同主机上。理想情况下,会有某种方式在内部处理路径,因此当它通过mod_wsgi 用作另一个用户时,我不必手动更改代码。

【问题讨论】:

    标签: python flask flask-sqlalchemy


    【解决方案1】:

    第一种方法:

    我最终得到了以下结构:

    • project_root ——还包含一些配置、.gitignore 文件等
      • start.py
      • flask_root
        • __init__.py
        • application.py
        • module_1
          • __init__.py
          • models.py
        • module_2
          • __init__.py
          • models.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 。

    不过,通过您的目录布局,您可以做到以下几点:

    models/__init__.py

    from application import db
    ...
    

    models/user.py

    from . import db
    ...
    

    第一种方法更干净和通用。当您需要在多个 Flask 项目之间共享相同的蓝图时,第二个可能很有用。

    【讨论】:

    • 我喜欢!一个问题......如果我在__main__ 条件的每个模型文件中都有测试逻辑,它们可能不会使用这种方法运行。我应该将单元测试放在根目录中,对吧?
    • 您可以使用 Flask-Script 扩展,您的测试将通过 ./application.py 提供。将测试代码留在它的模块中(对于小型测试,它更好更简单),但使用 Flask-Script 的装饰器将其放入函数中,它将创建一个命令。 ...您还可以创建一个装饰器,它将测试函数添加到某个全局列表中,以一次运行它们(通过命令,或仅在调试模式下启动时)。
    猜你喜欢
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多