【问题标题】:Django Signal request_finished get user instanseDjango Signal 请求完成获取用户实例
【发布时间】:2021-03-15 12:09:19
【问题描述】:

我尝试理解 Django 中的信号。我正在为 DRF 创建项目。

from django.dispatch import receiver
from django.contrib.auth.signals import user_logged_in
from django.core.signals import request_finished

对于这个信号我可以抓到用户

@receiver(user_logged_in)
def last_user_login(sender, request, user, **kwargs):
    print('User **{}** logged in'.format(user))

我想抓住这个信号的用户,但据我了解这是不可能的。

@receiver(request_finished)
def last_user_request(sender, **kwargs):
    print('User made request')

我的目标:捕获最后一个用户请求并将此数据写入数据库。

有人可以帮我吗?谢谢。

【问题讨论】:

    标签: django django-rest-framework django-signals


    【解决方案1】:

    写一个custom middleware来实现这个:

    middleware.py:

    class SimpleMiddleware:
       def __init__(self, get_response):
            self.get_response = get_response
            # One-time configuration and initialization.
        
        def __call__(self, request):
            # Code to be executed for each request before
            # the view (and later middleware) are called.
        
            response = self.get_response(request)
        
            print(response.status_code)
            print(request.user.username)
            # Add user data in db....
            if request.method == 'POST':
                print(request.POST)
        
            # Code to be executed for each request/response after
            # the view is called.
        
            return response
    
    

    settings.py:

    MIDDLEWARE = [
    
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',    
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
         
        'myproject.middleware.SimpleMiddleware',
        
    ]
    

    【讨论】:

      【解决方案2】:

      request_finished 信号仅包含有关其发送者类的信息,正如您在发送者的HttpResponseBase 类中看到的那样:

      signals.request_finished.send(sender=self._handler_class)
      

      为了完成你想要的,你可以考虑编写一个custom middleware,在那里你可以访问request对象,因此也可以访问User。如果您真的想在那里写入数据库,请考虑一下,它可能会很慢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-25
        • 1970-01-01
        • 2014-02-05
        • 1970-01-01
        • 2011-05-08
        相关资源
        最近更新 更多