从烧瓶蓝图中的主应用程序导入

时间:2014-05-16 01:38:58

标签: python flask

我正在用一个蓝图编写一个应用程序。我的应用程序使用Flask-SQLAlchemy,因此我的蓝图需要访问主应用程序的db对象(由Flask-SQLAlchemy创建)才能创建自己的模型。

但是,当我尝试使用db获取current_app.db对象时,flask会给我以下错误:

RuntimeError: working outside of application context

这是我的主要__init__.py

from flask import Flask

from app.uploader import uploader

app = Flask(__name__)

from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

app.register_blueprint(uploader)

这是__init__.py蓝图中的uploader

from flask import Blueprint

uploader = Blueprint('uploader', __name__,
    template_folder='templates')

from . import views
from .models import *

蓝图的views.py,其中发生例外:

from flask import (redirect, render_template, request, send_from_directory,
    session, current_app)
from flask.views import View
from werkzeug import secure_filename

print current_app.db # Exception happens here

这是堆栈跟踪:

Traceback (most recent call last):
  File "runtests.py", line 11, in <module>
    import tests
  File "/home/plasmasheep/project/tests.py", line 14, in <module>
    from app import app, db, user_datastore
  File "/home/plasmasheep/project/app/__init__.py", line 6, in <module>
    from app.uploader import uploader
  File "/home/plasmasheep/project/app/uploader/__init__.py", line 6, in <module>
    from . import views
  File "/home/plasmasheep/project/app/uploader/views.py", line 18, in <module>
    print current_app.db
  File "/home/plasmasheep/project/venv/lib/python2.7/site-packages/werkzeug/local.py", line 338, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/home/plasmasheep/project/venv/lib/python2.7/site-packages/werkzeug/local.py", line 297, in _get_current_object
    return self.__local()
  File "/home/plasmasheep/project/venv/lib/python2.7/site-packages/flask/globals.py", line 34, in _find_app
    raise RuntimeError('working outside of application context')
RuntimeError: working outside of application context

只是尝试使用from .. import db不起作用:

Traceback (most recent call last):
  File "runtests.py", line 11, in <module>
    import tests
  File "/home/plasmasheep/project/tests.py", line 14, in <module>
    from app import app, db, user_datastore
  File "/home/plasmasheep/project/app/__init__.py", line 7, in <module>
    from app.uploader import uploader
  File "/home/plasmasheep/project/app/uploader/__init__.py", line 6, in <module>
    from . import views
  File "/home/plasmasheep/project/app/uploader/views.py", line 17, in <module>
    from .. import db
ImportError: cannot import name db

from app import db

也不是
Traceback (most recent call last):
  File "runtests.py", line 11, in <module>
    import tests
  File "/home/plasmasheep/project/tests.py", line 14, in <module>
    from app import app, db, user_datastore
  File "/home/plasmasheep/project/app/__init__.py", line 7, in <module>
    from app.uploader import uploader
  File "/home/plasmasheep/project/app/uploader/__init__.py", line 6, in <module>
    from . import views
  File "/home/plasmasheep/project/app/uploader/views.py", line 17, in <module>
    from app import db
ImportError: cannot import name db

1 个答案:

答案 0 :(得分:5)

current_app仅在(基本上)请求/响应周期期间设置。通常,您只在内部视图中使用此内容,或者保证在视图内部调用的内容。当您无法直接访问应用时,通常会使用current_app,例如,如果您使用的是应用工厂。由于您没有使用工厂,只需直接导入数据库,它应该适用于您的情况。

导入错误是由于循环导入。将行from app.uploader import uploader移至db定义之后。请参阅this section of the docs中的几段,其中提到在定义任何依赖项后导入视图。

相关问题