2014-11-26 4 views
0

예상대로 작동하는 다양한 종점을 정의하는 Tastypie ModelResource이 있습니다.Django + Tastypie - user_logged_in 신호가 작동하지 않습니다.

지금이 ModelResourceBasicAuthentication을 갖도록 구성했습니다

class Meta: 
    authentication = BasicAuthentication() 

내가 장고 관리자 인터페이스를 통해 테스트 사용자의 몇 가지를 정의했다.

from django.core.signals import request_finished 
from django.contrib.auth.signals import user_logged_in 
from django.dispatch import receiver 

@receiver(user_logged_in) 
def on_login(sender, request, user, **kwargs): 
    print('******* LOGIN DETECTED *********') 

@receiver(request_finished) 
def on_request_finished(sender, **kwargs): 
    print('******* REQUEST FINISHED *******') 

apps.pyAppConfig에 의해 성공적으로로드 :

from django.apps import AppConfig 

class MyAppConfig(AppConfig): 
    name = 'myapp' 
    verbose_name = 'verbose description of myapp' 

    def ready(self): 
     import myapp.signals 

I

Django 1.7 Documentation 당, 나는 내가 테스트 신호의 몇 가지를 등록하는 signals.py을 만들었습니다 Requests 라이브러리를 사용하여 내 테스트 사용자 중 하나에게 기본 인증 자격 증명을 제공하여 API와 성공적으로 통신하십시오.

auth = HTTPBasicAuth(username, getpass('Enter password: ')) 
response = requests.get(self.url(endpoint), auth=self.auth, params = params) 

REQUEST FINISHED 인쇄물은 Django 서버의 출력에 표시되지만 LOGIN DETECTED에는 표시되지 않습니다.

Tastypie를 사용할 때 수동으로 로그인 신호를 실행해야합니까, 아니면 BasicAuthentication 이외의 다른 inbuilt/custom Authentication 클래스를 사용해야합니까? 즉, user_logged_in 신호가 자동으로 실행되지 않을 것으로 예상됩니까?

모든 정보는 크게 감사하겠습니다.

답변

0

Tastypie 소스 코드를 검사 한 후 authenticate 메서드를 호출하여 Django auth 백엔드에 연결하므로 보통 login 사이클 (authenticate이 하나의 구성 요소 임)을 트리거하지 않습니다. 결과적으로 login 메서드는 호출되지 않으므로 user_logged_in 신호는 절대 발생하지 않습니다.

내가 지금처럼 BasicAuthentication 및 최우선 is_authenticated을 확장하여 신호에게 자신을 제공 결국

:

class MyBasicAuthentication(BasicAuthentication): 
    def is_authenticated(self, request, **kwargs): 
     orig_user = request.user 
     has_authenticated = super(MyBasicAuthentication, self).is_authenticated(request, **kwargs) 
     if has_authenticated: 
      was_authenticated = orig_user == request.user 
      if not was_authenticated: 
       user_logged_in.send(sender=self.__class__, request=request, user=request.user) 
     return has_authenticated