Python Django rest验证用户登录信号

Python Django rest验证用户登录信号,python,django,rest,django-allauth,django-signals,Python,Django,Rest,Django Allauth,Django Signals,我有一个使用django rest auth的django rest应用程序。 每次用户使用信号登录时,我都会尝试记录一些内容 我在网上搜索了如何使用信号,但没有找到任何关于如何使用信号的有趣材料。我认为问题可能在于allauth信号。以下配置是否有任何问题 信号.py import logging from allauth.account.signals import user_logged_in from django.dispatch import receiver logger =

我有一个使用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))
from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'users'

    def ready(self):
        import users.signals
default_app_config = 'users.apps.UsersConfig'
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))
from .signals import *

// Your models here

class Foo(models.Model):
    pass
apps.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))
from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'users'

    def ready(self):
        import users.signals
default_app_config = 'users.apps.UsersConfig'
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))
from .signals import *

// Your models here

class Foo(models.Model):
    pass
\uuuu init\uuuuu.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))
from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'users'

    def ready(self):
        import users.signals
default_app_config = 'users.apps.UsersConfig'
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))
from .signals import *

// Your models here

class Foo(models.Model):
    pass

出于某种奇怪的原因,当放置在
signals.py
中时,这似乎不起作用,
signals.py
的这个实现对于项目的每个部分都很好,除了
allauth
(我也有我的个人经验)。检查此github是否可用sueshttps://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))

当配置基于令牌的身份验证时,Django Rest框架似乎不会发出
user\u logged\u in
信号:

下面是我如何使用
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,
}
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)

为未来的谷歌人。OP最初的问题是,每当用户使用rest_auth登录时,他都想记录一些东西。您可能希望rest\u auth会发出这样的信号,但rest\u auth会根据登录类型执行不同的操作。对于会话登录,rest_auth调用django的正常登录例程,并发出一个信号。但是对于基于令牌的身份验证,rest_auth创建令牌并返回它,并且不调用django-proper,也不发出信号。 这是剩下的

要获得所需的行为,必须覆盖rest_auth(很简单),以便知道何时创建令牌,然后根据需要记录事件

在django的settings.py文件中添加:

REST\u AUTH\u TOKEN\u CREATOR='.创建\u login\u 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
#这与默认的rest\u auth令牌处理程序相同,只是我们
#不要因为我们关心“创建的”部分是否存在而将其丢弃
#创建或刚刚检索。
def创建登录令牌(令牌模型、用户、序列化程序):
令牌,created=token\u model.objects.get\u或\u create(user=user)
如果创建:

>>>记录它或发出你自己的信号或任何由于某种奇怪的原因,它无法从
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))
from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'users'

    def ready(self):
        import users.signals
default_app_config = 'users.apps.UsersConfig'
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))
from .signals import *

// Your models here

class Foo(models.Model):
    pass
型号.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))
from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'users'

    def ready(self):
        import users.signals
default_app_config = 'users.apps.UsersConfig'
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))
from .signals import *

// Your models here

class Foo(models.Model):
    pass

我缺少一些配置资料吗?对我来说一切都很好,你能确保在设置中配置了
用户
应用程序的记录器吗(只是为了确保),否则我看不出有任何理由不在
models.py
中工作,并重新启动本地服务器,它应该可以工作。我已经尝试将代码移动到
model.py
,但它不工作。我认为问题可能出在allauth配置中,因为我试着调试它,但它从未击中任何接收器。。。然后我试着把请求添加到完成的接收器上,结果成功了。所以我认为问题在于allaurh信号,但是文档太差了。自从Dajngo3.2更新以来,这个回归问题已经解决了。现在,当将这些函数放入signal.py中时,它也能按预期工作。它对我也起作用。谢谢但是,最好也提到,需要将“rest_framework_jwt.authentication.JSONWebTokenAuthentication”添加到settings.py中的rest_framework变量中。自从对dajngo 3.2进行更新以来,这种回归已经得到解决。现在,当将这些函数放入signal.py中时,它也可以按需要工作。