我有一个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 *******')
我AppConfig
在apps.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
信号不会自动触发?
任何信息都将不胜感激。
答案 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