模型的Python清理导入 - SQL Alchemy

Dea*_*ado 4 python flask flask-sqlalchemy

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

  • MYAPP /
    • application.py
    • __init__.py
    • 楷模/
      • __init__.py
      • user.py

模型使用Flask-SQLAlchemy,因此,他们需要访问db对象(SQLAlchemy实例)application.py

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 
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*okk 6

第一种方法:

我最终得到了以下结构:

  • 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()
Run Code Online (Sandbox Code Playgroud)

Python 在脚本开始的目录中搜索包,所以现在你不需要将它们添加到sys.path(就我而言,sys.path的修改看起来很难看).现在你有了一个完整的flask_root python包,你可以从你的应用程序的任何地方导入它的所有内容:

from flask_root.application import db
Run Code Online (Sandbox Code Playgroud)

第二种方法:

如果从它的目录启动Flask应用程序,

./application.py runserver
Run Code Online (Sandbox Code Playgroud)

您启动的目录无法作为python包访问,即使它中包含__init__.py也是如此.

但是,使用您的目录布局,您可以执行以下操作:

models/__ init__.py:

from application import db
...
Run Code Online (Sandbox Code Playgroud)

models/user.py:

from . import db
...
Run Code Online (Sandbox Code Playgroud)

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