AttributeError:'RequestContext'对象没有属性'user'

时间:2013-05-22 15:09:52

标签: python flask

我收到了这个错误,我想要任何输入,因为它现在是一堵砖墙。

我有一个应用程序,即使用flask-security,它通过flask-login导入current_user。任何集成问题都是过去的,已经有一段时间了。

我需要过滤一些特定信息的请求,我将其放在g上。我有一个有效的蓝图,过去任何整合问题。

昨天,我将此请求过滤蓝图功能提取到general extension,它基本上将信息过滤到g,并且变得更容易配置,因此它或多或少已准备好并经过测试。此扩展程序替换this blueprint以生成跨应用程序请求过滤器

我把它放回到我的应用程序中,现在我已经得到了这个,并且如上所述它是不透明的:我不知道用户不在RequestContext中的位置或原因

Traceback (most recent call last):
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask/app.py", line 1689, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask/app.py", line 1687, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask/app.py", line 1356, in full_dispatch_request
    rv = self.preprocess_request()
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask/app.py", line 1539, in preprocess_request
    rv = func()
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/Flask_Flarf-0.0.1-py2.7.egg/flask_flarf/flarf.py", line 48, in preprocess_request
    preprocess_func(r)
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/Project_Producer-0.0.1-py2.7.egg/project_producer/config/configs/request_filters_config.py", line 10, in preprocess_with_user
    g.preprocessed = current_app.extensions['flarf'].preprocess_cls(request)
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/Project_Producer-0.0.1-py2.7.egg/project_producer/config/configs/request_filters_config.py", line 17, in __init__
    self.aid = self.determine_account(request)
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/Project_Producer-0.0.1-py2.7.egg/project_producer/config/configs/request_filters_config.py", line 51, in determine_account
    current_user.account.identifier])
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/werkzeug/local.py", line 336, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/werkzeug/local.py", line 295, in _get_current_object
    return self.__local()
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask_login.py", line 403, in <lambda>
    current_user = LocalProxy(lambda: _request_ctx_stack.top.user)
AttributeError: 'RequestContext' object has no attribute 'user'

理论:

1)此功能:

def preprocess_request(preprocess_func=self.preprocess_func):
        r = _request_ctx_stack.top.request
        request_endpoint = str(r.url_rule.endpoint).rsplit('.')[-1]
        if request_endpoint not in _flarf.preprocess_skip:
            preprocess_func(r)

所以在跟踪中上面开心的是preprocess_request运行调用app本地定义的preprocess_func,它本身创建一个app本地定义的类实例来附加到g,这个本地定义的类实例使用'current_user'...是错误的地方。

使用_request_ctx_stack尚未与用户联系或删除用户。多次弹出或触摸_request_ctx_stack.top.request可能“不好”

2)操作顺序,在flask-security添加用户

之前,preprocess_request正在运行

3)毫无头绪,有点失落atm

有什么建议吗?

编辑:

问题很可能是方法解析,因为current_app.before_request_funcs返回:

{None: [<function flarf_filter_request at 0x1a781b8>, <bound method LoginManager._load_user of <flask_login.LoginManager object at 0x1a79990>>, <bound method Principal._on_before_request of <flask_principal.Principal object at 0x1a80290>>]}

所以主要内容是我做错了,如果我需要获取before_request信息,在烧瓶运行那些函数的before_request时间内获取该信息并不是最佳的,因为目前没有对before_request函数的排序。< / p>

选项?

  1. 添加一个选项以将before_request函数命令为flask,可能与优先级关键字一样简单,并调用已排序或有序的字典

  2. 改变我正在做的事情的策略,例如:将此从before_request更改为装饰器。但是,这将需要每个视图符号,并且创建蓝图和扩展的整个要点是跳过必须基于每个视图收集某些信息。上行将是计划的多个过滤器。

  3. 一种有用的预制解决方案:Flask-Classy


1 个答案:

答案 0 :(得分:1)

嘿,我也碰到了这个,但是和Django一样,完全一样的错误。所以我认为这可能类似。 RequestContext不是请求,但它包含它。它是django中的一个特殊类,当它由您的视图创建时,它实际上包含请求以及从视图传递到模板的所有其他上下文变量。

以下是它的创建方式:

c = RequestContext(request, {
    'foo': 'bar',
})

有关here的更多信息。在Flask文档中。

长话短说,RequestContext是一个包含'request'键内请求的dict。所以你可以这样访问它:

request = context['request']
user = request.user

在您的模板中,您可以正常访问请求,request.user应该可以正常工作。希望这会有所帮助,我觉得这在Flask和Django中可能类似。如果这没有帮助,您可以打印出您的上下文并查看它包含的数据。多数民众赞成我如何解决我的问题。

干杯