【问题标题】:Django + Tastypie - user_logged_in signal doesn't workDjango + Tastypie - user_logged_in 信号不起作用
【发布时间】:2014-11-26 12:39:24
【问题描述】:

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

任何信息将不胜感激。

【问题讨论】:

    标签: django login request signals tastypie


    【解决方案1】:

    检查 Tastypie 源代码后,它通过调用 authenticate 方法与 Django 身份验证后端绑定,因此不会触发通常的 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
    

    【讨论】:

      猜你喜欢
      • 2017-09-04
      • 2015-01-22
      • 2021-04-21
      • 2011-09-03
      • 2012-07-29
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多