gpt4 book ai didi

python - 属性错误 : 'RequestContext' object has no attribute 'user'

转载 作者:太空宇宙 更新时间:2023-11-04 06:14:25 31 4
gpt4 key购买 nike

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

我有一个应用程序,它正在使用 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 运行调用应用程序本地定义的 preprocess_func,它本身创建一个应用程序本地定义的类实例以附加到 g,这个本地定义的类实例使用“current_user”......是错误的地方。

在使用 _request_ctx_stack 之前跑来跑去,或者还没有与用户联系或删除用户。多次弹出或触摸 _request_ctx_stack.top.request 可能“不好”

2) 操作顺序,preprocess_request 在 flask-security 添加用户之前运行

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 信息,在 flask 运行这些函数的 before_request 时间内获取该信息并不是最佳的,因为目前没有 before_request 函数的排序。

选项?

  1. 向 flask 添加一个选项来对 before_request 函数进行排序,可能与优先关键字一样简单,并调用已排序或已排序的字典

  2. 根据我正在做的事情改变策略,例如将其从 before_request 更改为装饰器。但是,这将需要每个 View 的符号,而创建蓝图和扩展的全部意义在于跳过必须在每个 View 的基础上收集某些信息。好处是计划中的多个过滤器。

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


最佳答案

嘿,我也遇到了这个问题,但是使用 Django 时,出现了完全相同的错误。所以我认为这可能是相似的。 RequestContext 不是一个请求,但它包含它。它是 django 中的一个特殊类,当它由您的 View 创建时,它实际上包含请求以及您从 View 传递到模板的所有其他上下文变量。

这是它的创建方式:

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

更多信息 here .而在 Flask文档。

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

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

在您的模板中,您可以像往常一样访问请求,request.user 应该可以工作。希望这会有所帮助,我觉得这在 Flask 和 Django 中可能是相似的。如果这没有帮助,您可以打印出上下文并查看其中包含的数据。这就是我解决问题的方式。

干杯

关于python - 属性错误 : 'RequestContext' object has no attribute 'user' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16695418/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com