首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >姜戈静止user_logged_in信号

姜戈静止user_logged_in信号
EN

Stack Overflow用户
提问于 2017-04-08 20:59:36
回答 5查看 8.4K关注 0票数 5

我有一个django rest应用程序使用django rest。每当用户使用信号登录时,我都会尝试记录一些信息。

我在网上搜索了如何使用信号,但我没有找到任何有趣的材料,如何使它工作。我认为问题可能是信号。下面的配置有问题吗?

signals.py

代码语言:javascript
复制
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

代码语言:javascript
复制
from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'users'

    def ready(self):
        import users.signals

__init__.py

代码语言:javascript
复制
default_app_config = 'users.apps.UsersConfig'
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-02-25 06:17:23

下面是我如何使用djangorestframework-jwt==1.11.0解决这个问题

settings.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
票数 9
EN

Stack Overflow用户

发布于 2017-09-20 23:48:26

在配置基于令牌的身份验证时,Django Rest框架似乎不会发出user_logged_in信号:https://github.com/encode/django-rest-framework/issues/3869

票数 2
EN

Stack Overflow用户

发布于 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'

在项目中的某个文件中:

代码语言:javascript
复制
# 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43300305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档