gpt4 book ai didi

python - 从 flask 蓝图中的主应用程序导入

转载 作者:太空狗 更新时间:2023-10-30 02:31:06 25 4
gpt4 key购买 nike

我正在编写一个包含一个蓝图的应用程序。我的应用程序使用 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)

这是来 self 的 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

最佳答案

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

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

关于python - 从 flask 蓝图中的主应用程序导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23691339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com