我有一个django rest应用程序使用django rest。每当用户使用信号登录时,我都会尝试记录一些信息。
我在网上搜索了如何使用信号,但我没有找到任何有趣的材料,如何使它工作。我认为问题可能是信号。下面的配置有问题吗?
signals.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))apps.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'发布于 2018-02-25 06:17:23
下面是我如何使用djangorestframework-jwt==1.11.0解决这个问题
settings.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,
}models.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)发布于 2017-09-20 23:48:26
在配置基于令牌的身份验证时,Django Rest框架似乎不会发出user_logged_in信号:https://github.com/encode/django-rest-framework/issues/3869
发布于 2020-03-10 23:05:14
给未来的谷歌人。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 tokenhttps://stackoverflow.com/questions/43300305
复制相似问题