Django + Tastypie - user_logged_in信号不起作用

时间:2014-11-26 12:39:24

标签: django login request signals tastypie

我有一个Tastypie ModelResource定义了各种可以按预期工作的端点。

我现在已将此ModelResource配置为BasicAuthentication

class Meta:
    authentication = BasicAuthentication()

我已经通过Django管理界面定义了几个测试用户。

根据Django 1.7 Documentation,我创建了一个signals.py,其中我注册了几个测试信号:

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 *******')

AppConfigapps.py

中成功加载了此内容
from django.apps import AppConfig

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

    def ready(self):
        import myapp.signals

我使用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时手动触发登录信号,或使用除Authentication之外的其他内置/自定义BasicAuthentication类?换句话说,是否预期user_logged_in信号不会自动触发?

任何信息都将不胜感激。

1 个答案:

答案 0 :(得分:1)

在检查了Tastypie源代码之后,它通过调用authenticate方法与Django auth后端绑定,因此不会触发login的{​​{1}}周期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