所以我有一个以这种方式构建的烧瓶应用程序
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
中旨在实现这一目标的脚本(参考flask-script docs)
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中,我有来自每个模块的导入语句,“代理商”,“auth”等等。
但是,当我进入我的shell环境时,我必须以models.Users
而不是直接Users
来访问我的课程,这不是我所期望的。如何自动导入所有内容以便我可以直接访问这些类?
答案 0 :(得分:1)
下面是一个简化的解决方案,假设您正在使用SQLAlchemy(db.Model)。如果没有,您只需要更改issubclass if-statement以匹配对要导入的内容的相应检查。
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()
答案 1 :(得分:0)
而不是
from app import models
你可以这样做:
from app.models import *
这将导入模型中的所有类,变量。注意:通常不建议导入*但在这种情况下,它可能适合您。理想情况下,您应该执行以下操作:
from app.models import Users, ...and so on