2013-05-22 40 views
1

我得到这个错误,我想要任何输入,因为它现在是砖墙。AttributeError:'RequestContext'对象没有'user'属性

我有一个应用程序,即使用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) 

那么,什么是在跟踪上述happpening是,preproc ess_request运行调用应用程序本地定义的preprocess_func,它自己创建一个应用程序本地定义的类实例以附加到g,这个本地定义的类实例使用'current_user'...并且这是它的错误。

运行,之前或使用_request_ctx_stack尚未与用户联系或删除用户。乘爆裂或触摸_request_ctx_stack.top.request是也许“不好”

2)的操作顺序,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时间内得到那些信息,那么flask运行这些函数并不是最优的,因为目前没有before_request函数的排序。

选项?

  1. 添加选项命令before_request功能瓶中,可能作为优先关键字一样简单,并与我在做什么来电分类或有序字典

  2. 改变战术,例如将其从before_request更改为装饰器。但是,这需要一个观点符号,而创建蓝图和扩展的重点就是不必为每个视图收集某些信息。上行将是多个过滤器计划。

  3. 一个有用的,预先制备:烧瓶优等


回答

0

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

这里是它是如何创建的:

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

更多的是here。并在Flask文档中。

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

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

在模板访问请求,你通常会,request.user应该工作。希望这有帮助,我有一种感觉,这可能在Flask和Django中类似。如果这不起作用,您可以打印出您的上下文并查看它包含的数据。多数民众赞成我是如何找出我的问题。

干杯