1

所以我有一个以这种方式构建的烧瓶应用程序

calvin % tree -L 3 .
.
├── README
├── alembic
│   ├── README
│   ├── env.py
│   ├── env.pyc
│   ├── script.py.mako
│   └── versions
├── alembic.ini
├── api.sublime-project
├── app
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── admin
│   │   ├── __init__.py
│   │   └── __init__.pyc
│   ├── agencies
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── models.py
│   │   └── models.pyc
│   ├── agents
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── models.py
│   │   ├── models.pyc
│   │   ├── views.py
│   │   └── views.pyc
│   ├── api.py
│   ├── api.pyc
│   ├── auth
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── constants.py
│   │   ├── constants.pyc
│   │   ├── decorators.py
│   │   ├── decorators.pyc
│   │   ├── models.py
│   │   ├── models.pyc
│   │   ├── views.py
│   │   └── views.pyc
│   ├── districts
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── models.py
│   │   ├── models.pyc
│   │   ├── views.py
│   │   └── views.pyc
│   ├── helpers.py
│   ├── helpers.pyc
│   ├── middleware.py
│   ├── middleware.pyc
│   ├── models.py
│   ├── models.pyc
│   ├── properties
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── models.py
│   │   └── models.pyc
│   ├── templates
│   │   └── index.html
│   ├── users
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── models.py
│   │   ├── models.pyc
│   │   ├── views.py
│   │   └── views.pyc
│   └── viewings
│       ├── __init__.py
│       ├── __init__.pyc
│       ├── models.py
│       ├── models.pyc
│       ├── views.py
│       └── views.pyc
├── config.py
├── config.pyc
├── manage.py
├── requirements.txt
├── run.py
└── shell.py

我正在设置我的 shell,以便它models.py在我执行时自动导入文件中的所有类./manage.py shell

manage.py是旨在实现这一目标的脚本(参考烧瓶脚本文档)

def _make_context():
    from app import models
    return dict(app=app, db=db, models=models)  # TODO: this is not working appropriately
manager.add_command("shell", Shell(make_context=_make_context))

在我的 app/models.py 中,我有来自每个模块、“代理”、“身份验证”等的导入语句。

但是,当我进入我的 shell 环境时,我必须访问我的类models.Users而不是直接访问Users,这不是我所期望的。如何自动导入所有内容以便我可以直接访问这些类?

4

2 回答 2

1

下面是一个简化的解决方案,假设您使用的是 SQLAlchemy (db.Model)。如果没有,您应该只需要更改 issubclass if 语句以匹配您对要导入的内容的适当检查。

from app import db, create_app
import app.models as models
from flask.ext.script import Manager, Shell 
app = create_app()
manager = Manager(app)

def make_shell_context():
    return_dict = {}
    # grab everything we can possibly import from the models module
    module_importables = dir(models)
    for importable in module_importables:
        # if it isn't a class, it'll throw a TypeError exception that importable is not a class
        try:
            # we only want our SQLAlchemy models
            if issubclass(getattr(models,importable),db.Model):
                return_dict[importable] = getattr(models,importable)
        except TypeError as inst:
            pass
    return_dict['app'] = app
    return_dict['db'] = db
    return return_dict

manager.add_command("shell", Shell(make_context=make_shell_context))

if __name__ == '__main__':
    manager.run()
于 2014-06-10T18:26:46.717 回答
0

代替

from app import models

你可以做:

from app.models import *

这将从模型中导入所有类和变量。注意:通常不建议导入 *,但在这种情况下,它可能对您有用。理想情况下,您应该执行以下操作:

from app.models import Users, ...and so on
于 2013-08-07T16:17:07.270 回答