AttributeError:' _AppCtxGlobals'对象没有属性'用户'在烧瓶中使用g

时间:2014-11-19 22:25:09

标签: python flask

我在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' object没有属性' 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'

请帮助..............

1 个答案:

答案 0 :(得分:2)

有几种方法可以解决上下文并在使用蓝图的Flask应用程序之间共享before_request

为什么会收到错误:

my_blueprint only.

中的每个请求之前调用

my_blueprint.before_request

如果您的其他文件不在该蓝图中,则需要做更多工作。

以下是一些选项:

  1. 如果您需要在所有蓝图中所有请求之前运行某些内容,请使用before_app_requesthttp://flask.pocoo.org/docs/api/#flask.Blueprint.before_app_request

  2. 如果您有要重复使用的before_request命令(但未全局设置),请编写before_request函数,将其存储在文件中,导入并将其提供给装饰器

  3. e.g。 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函数应用于蓝图而不将其存储在每个文件中。