![](/img/trans.png)
[英]User is set to AnonymousUser after a user_logged_in signal is received in Django with all-auth
[英]Django rest auth user_logged_in signal
我有一个使用 django rest auth 的 django rest 应用程序。 每次用户使用信号登录时,我都试图记录一些内容。
我在网上搜索过如何使用信号,但没有找到任何关于如何使其工作的有趣材料。 我认为问题可能出在 allauth 信号上。 下面的配置有问题吗?
信号.py
import logging
from allauth.account.signals import user_logged_in
from django.dispatch import receiver
logger = logging.getLogger(__name__)
@receiver(user_logged_in)
def login_logger(request, user, **kwargs):
logger.info("{} logged in with {}".format(user.email, request))
应用程序.py
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
def ready(self):
import users.signals
__init__.py
default_app_config = 'users.apps.UsersConfig'
这是我使用djangorestframework-jwt==1.11.0
解决它的方法:
设置.py
from django.contrib.auth.signals import user_logged_in
def jwt_response_payload_handler(token, user=None, request=None):
if user and request:
user_logged_in.send(sender=user.__class__, request=request, user=user)
return {
'token': token,
}
JWT_AUTH = {
'JWT_RESPONSE_PAYLOAD_HANDLER': jwt_response_payload_handler,
}
模型.py
from django.contrib.auth.signals import user_logged_in
def login_handler(sender, user, request, **kwargs):
print('logged in')
user_logged_in.connect(login_handler)
配置基于令牌的身份验证时,Django Rest Framework 似乎不会发出user_logged_in
信号: https : //github.com/encode/django-rest-framework/issues/3869
对于一些奇怪的原因,这似乎工作不放在时候signals.py
,这个实现的signals.py
工作正常,除了项目的每一个部分allauth
(我有我的个人经验太)。 检查这个github问题https://github.com/pennersr/django-allauth/issues/347
出于某种奇怪的原因,将此代码( signals.py
)移动到同一应用程序的models.py
中将起作用。
# place this in models.py
from allauth.account.signals import user_logged_in
from django.dispatch import receiver
logger = logging.getLogger(__name__)
@receiver(user_logged_in)
def login_logger(request, user, **kwargs):
logger.info("{} logged in with {}".format(user.email, request))
对于未来的谷歌员工。 OP 的最初问题是他想在每次用户使用 rest_auth 登录时记录一些内容。 您会期望 rest_auth 为这样的事情发出信号,但 rest_auth 会根据登录类型执行不同的操作。 对于会话登录,rest_auth 调用 django 的正常登录例程并发出信号。 但是对于基于令牌的身份验证,rest_auth 创建令牌并返回它,并且没有对 django 的调用,也没有发出任何信号。 这是 rest_auth 登录代码
要获得您想要的行为,您必须覆盖 rest_auth 的默认令牌处理程序(很简单),以便您知道何时创建了令牌,然后根据需要记录事件。
在 django 的 settings.py 文件中添加:
REST_AUTH_TOKEN_CREATOR = '<your_dotted_project_path>.create_login_token'
在项目中的某个文件中:
# this is the same as the default rest_auth token handler except we
# don't throw away the 'created' part because we care whether it was
# created or just retrieved.
def create_login_token(token_model, user, serializer):
token, created = token_model.objects.get_or_create(user=user)
if created:
>>> log it or emit your own signal or whatever <<<
return token
由于某种奇怪的原因,它没有从signals.py
提取。 但是,您仍然可以使用以下方法保持关注点分离。 这对我有用,同时仍然使信号逻辑远离我的模型。
信号.py
import logging
from allauth.account.signals import user_logged_in
from django.dispatch import receiver
logger = logging.getLogger(__name__)
@receiver(user_logged_in)
def login_logger(request, user, **kwargs):
logger.info("{} logged in with {}".format(user.email, request))
模型.py
from .signals import *
// Your models here
class Foo(models.Model):
pass
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.