2013-05-22 5 views
1

지금은 벽돌 벽이므로이 오류가 발생합니다. 입력이 필요합니다.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 시간 내에 그 정보를 얻는 것이 최적이 아닙니다.

옵션?

  1. 기능, 예를하는 우선 순위 키워드로 가능한 한 간단 플라스크 내가 뭘하는지로 분류하거나 순서 DICT

  2. 변경 전술에 전화를 before_request 주문하는 옵션 추가 before_request에서 데코레이터로 변경하십시오. 그러나 뷰 당 표기법이 필요하고 청사진과 확장을 만드는 전체적인 시점은 뷰 단위로 특정 정보를 수집하지 않아도된다는 것입니다. 위쪽에는 여러 개의 필터가 계획되었습니다.

  3. 유용한, 미리 만들어진 솔루션 : 플라스크 - 고급스러운


답변

0

이봐 나뿐만 아니라이 우연히하지만 장고와, 동일한 오류가 발생했습니다. 그래서 나는 이것이 비슷하다고 생각했다. RequestContext는 요청이 아니지만 요청을 포함하고 있습니다. django의 특별한 클래스이며 뷰에 의해 생성 된 뷰에는 실제로 뷰에서 템플릿으로 전달하는 다른 모든 컨텍스트 변수와 함께 요청이 포함됩니다. 여기

는 만드는 방법입니다 : 그 here

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

더. 그리고 Flask docs.

간단히 말해서 RequestContext는 '요청'키 내에 요청을 포함하는 dict입니다. 따라서 다음과 같이 액세스 할 수 있습니다 :

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

템플릿에서 평소와 같이 요청에 액세스하면 request.user가 작동해야합니다. 이것이 도움이 되었기를 바랍니다. Flask와 Django에서 이와 비슷한 느낌이 들었습니다. 이 방법이 도움이되지 않는다면 컨텍스트를 인쇄하여 포함 된 데이터를 확인할 수 있습니다. 어떻게 내가 내 문제를 알아 냈어.

건배

관련 문제