我在insidemyapp中有很多.py文件
@def_app.before_request
def before_request():
if 'user' in session:
if session['type']=='rest':
try:
r=query_db('select email,name,r_area,city,mobile_no,r_image,r_id from rest_user where email =%s',[session['user']])
if r:
for i in r:
g.user=i
break
except:
pass
else:
try:
r= query_db('select email,name,street,city,mobile_no,image from r_users where email = %s',[session['user']])
if r:
for i in r:
g.user=i
print(g.user)
break
except:
pass
当我在其他py文件中使用g.user时我们收到错误(AttributeError:’_ AppCtxGlobals’对象没有属性’user’)
当我使用蓝图将我的单个app文件转换为多个时,会发生这种情况
错误结果
Traceback (most recent call last):
File "C:\Python33\lib\site-packages\flask\app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Python33\lib\site-packages\flask\app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "C:\Python33\lib\site-packages\flask\app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Python33\lib\site-packages\flask\_compat.py", line 33, in reraise
raise value
File "C:\Python33\lib\site-packages\flask\app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "C:\Python33\lib\site-packages\flask\app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Python33\lib\site-packages\flask\app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Python33\lib\site-packages\flask\_compat.py", line 33, in reraise
raise value
File "C:\Python33\lib\site-packages\flask\app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Python33\lib\site-packages\flask\app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\mehrab alam\Google Drive\organized\myapp\insidemyapp\profile.py", line 25, in profile
print(g.user)
File "C:\Python33\lib\site-packages\werkzeug\local.py", line 338, in __getattr__
return getattr(self._get_current_object(), name)
AttributeError: '_AppCtxGlobals' object has no attribute 'user'
请帮忙…………..
最佳答案 有几种方法可以解决在使用蓝图的Flask应用程序之间保持上下文和共享before_request的问题.
为什么你会收到错误:
在my_blueprint
only.之内的每个请求之前调用my_blueprint.before_request
如果您的其他文件不在该蓝图中,则需要做更多工作.
以下是一些选项:
>如果您需要在所有蓝图中的所有请求之前运行某些内容,请使用before_app_request.
http://flask.pocoo.org/docs/api/#flask.Blueprint.before_app_request
>如果您要重新使用before_request命令(但不是全局设置),请编写before_request函数,将其存储在文件中,导入它,然后将其提供给装饰器.
例如utils的/ shared_functions.py:
from flask import g, session
from app.users.models import Users
def before_request():
"""pull user info from the database based on session id"""
g.user = None
if 'user_id' in session:
try:
try:
g.user = Users.query.get(session['user_id'])
except TypeError: # session probably expired
pass
except KeyError:
pass
然后在你的调用文件site_view.py中:
from ..utils import shared_functions
my_module = Blueprint('reviews', __name__, url_prefix='/cat_farm')
my_module.before_request(shared_functions.before_request)
第二种方法将允许您区别地将before_request函数应用于蓝图而不将其存储在每个文件中.