繁体   English   中英

Django rest auth user_logged_in 信号

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM