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

Pla*_*sma 4 python flask

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

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

RuntimeError: working outside of application context
Run Code Online (Sandbox Code Playgroud)

这是我的主要内容__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)
Run Code Online (Sandbox Code Playgroud)

这是__init__.py我的uploader蓝图:

from flask import Blueprint

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

from . import views
from .models import *
Run Code Online (Sandbox Code Playgroud)

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

这是堆栈跟踪:

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

只是尝试使用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
Run Code Online (Sandbox Code Playgroud)

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

dav*_*ism 6

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

导入错误是由于循环导入.将行from app.uploader import uploader移到定义之后db.请参阅文档的这一部分中的几段,其中提到在定义任何依赖项后导入视图.