2012-07-19 66 views
4

我有以下目录结构的烧瓶中的应用:的Python干净进口车型 - SQL炼金术

  • MYAPP/
    • application.py
    • __init__.py
    • 型号/
      • __init__.py
      • user.py

这款机型采用烧瓶SQLAlchemy的,因此,他们需要从application.py

user.py有机会获得db对象(例如SQLAlchemy的):

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属性,所以我必须将此整个包放到第e路径,然后从主应用程序模块导入。为了理智,我想将模型保存在单独的文件中。我需要将路径代码放在每个模型的顶部吗?有没有更好的办法?我宁愿没有像这样的完整路径输入,因为它们可能被部署到具有不同目录结构的不同主机。理想情况下,会有一些内部处理路径的方式,因此当它作为另一个用户通过mod_wsgi使用时,我不必手动更改代码。

回答

6

1的方法:

我已经结束了结构如下:

  • project_root- 也持有一些CONFIGS,.gitignore文件以等
    • start.py
    • flask_root
      • __init__.py
      • application.py
      • module_1
        • __init__.py
        • models.py
      • module_2
        • __init__.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开始的目录不能作为python包访问,即使它包含__init__.py也是如此。

虽然,你的目录布局,你可以做下面的技巧:

型号/ __ init__.py

from application import db 
... 

型号/ user.py

from . import db 
... 

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

+0

我喜欢!有一个问题......如果我在'__main__'条件中的每个模型文件中都有测试逻辑,那么它们可能不会以这种方式运行。我应该把单元测试放在根目录下,对吧? – DeaconDesperado 2012-07-20 13:47:27

+0

您可以使用Flask-Script扩展,您的测试将通过./application.py 提供。将测试代码留在它的模块中(对于小型测试来说它更好,更简单),但是将它与Flask-Script的装饰器一起使用,它将创建一个命令。 ...你也可以创建一个装饰器,它将把测试函数添加到某个全局列表中,以便一次全部运行它们(通过命令,或者仅在调试模式下启动时)。 – HighCat 2012-07-20 14:54:36

+0

可以链接到显示第一个示例的项目吗? – Mbrevda 2013-05-29 14:46:16