python – AttributeError:’_ AppCtxGlobals’对象在使用g的烧瓶中没有属性’user’

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

点赞