4

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

  • 我的应用程序/
    • 应用程序.py
    • __init__.py
    • 楷模/
      • __init__.py
      • 用户.py

这些模型使用 Flask-SQLAlchemy,因此,它们需要dbapplication.py

用户.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我不必手动更改代码。

4

1 回答 1

6

第一种方法:

我最终得到了以下结构:

  • project_root — 还包含一些配置、.gitignore 文件等
    • 开始.py
    • 烧瓶根
      • __init__.py
      • 应用程序.py
      • 模块_1
        • __init__.py
        • 模型.py
      • 模块_2
        • __init__.py
        • 模型.py

最上面的 start.py 只是运行应用程序:

#! /usr/bin/env python
from flask_root import applicaiton

if __name__ == '__main__':
    application.manager.run()

Python在你的脚本开始的目录中搜索包,所以现在你不需要将它们添加到 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
...

模型/user.py

from . import db
...

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

于 2012-07-19T21:26:04.423 回答