지금은 벽돌 벽이므로이 오류가 발생합니다. 입력이 필요합니다.AttributeError : 'RequestContext'객체에 'user'속성이 없습니다.
플라스크 로그인을 통해 current_user를 가져 오는 flask-security를 사용하는 응용 프로그램이 있습니다. 모든 통합 문제는 과거에 있었고 얼마 동안이었습니다.
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는 app local 정의 된 preprocess_func을 호출합니다.이 approcess_func 자체는 app 로컬 정의 클래스 인스턴스를 생성하여 g에 연결합니다.이 로컬 정의 클래스 인스턴스는 'current_user'...를 사용하고 오류가있는 곳입니다.
은 실행 전, 또는 _request_ctx_stack을 (를) 사용하는 사용자가 아직 사용자에게 연락하지 않았거나 사용자를 삭제하지 않습니다. 터지는 또는 접촉 _request_ctx_stack.top.request 어쩌면 '좋지 않다'는 곱
는2) 작업의 순서는 preprocess_request 사용자
3에게) 단서를 추가하지 플라스크 보안 전에 실행되고, 조금
기압 손실제안 사항이 있으십니까?
는 편집 :
문제는 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 시간 내에 그 정보를 얻는 것이 최적이 아닙니다.
옵션?
기능, 예를하는 우선 순위 키워드로 가능한 한 간단 플라스크 내가 뭘하는지로 분류하거나 순서 DICT
변경 전술에 전화를 before_request 주문하는 옵션 추가 before_request에서 데코레이터로 변경하십시오. 그러나 뷰 당 표기법이 필요하고 청사진과 확장을 만드는 전체적인 시점은 뷰 단위로 특정 정보를 수집하지 않아도된다는 것입니다. 위쪽에는 여러 개의 필터가 계획되었습니다.
유용한, 미리 만들어진 솔루션 : 플라스크 - 고급스러운