【问题标题】:Importing from main app in a flask blueprint从烧瓶蓝图中的主应用程序导入
【发布时间】:2014-05-16 01:38:58
【问题描述】:

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

但是,当我尝试使用current_app.db 获取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)

这是我的uploader 蓝图中的__init__.py

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

【问题讨论】:

    标签: python flask


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 2012-06-16
      相关资源
      最近更新 更多