【问题标题】:Django Middleware user is always anonymus (REST, SimpleJWT)Django 中间件用户始终是匿名用户(REST、SimpleJWT)
【发布时间】:2021-09-21 22:24:54
【问题描述】:

我正在使用 Django REST Framework 和 rest_framework_simplejwt 并尝试编写我自己的中间件,每次用户执行一个中间件时都会更新 user.last_request

from django.utils.timezone import now

class LastRequestMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.user.is_authenticated:
            request.user.last_request = now()
            request.user.save()
        response = self.get_response(request)
        return response```
But every time `user.is_authenticated` returns `False'

【问题讨论】:

  • django rest中没有中间件这样的认证,可以使用token认证代替。

标签: python django django-rest-framework django-rest-framework-simplejwt


【解决方案1】:

我发现解决此问题的最简单方法是手动验证中间件中的用户。新代码如下所示:

from django.utils.timezone import now
from rest_framework_simplejwt.authentication import JWTAuthentication


class LastRequestMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        user = JWTAuthentication().authenticate(request)[0]

        if user:
            user = user[0]
            if user.is_authenticated:
                user.last_request = now()
                user.save(update_fields=['last_request'])
        response = self.get_response(request)
        return response

这很容易解决,因此如果您需要在许多中间件中使用用户身份验证功能,请考虑使用单独的 AuthMiddleware 进行 SimpleJWT 身份验证。

【讨论】:

  • 在调用self.get_response() 后尝试获取request.user。这是因为 DRF 情况下的身份验证发生在视图中。所以在处理完响应后,request.user 应该已经被 api 视图填满了
  • 我认为使用中间件对用户进行两次身份验证,一次在中间件中,另一次在 drf-simple-jwt 视图中。
猜你喜欢
  • 2021-04-11
  • 2020-01-31
  • 2014-09-15
  • 2014-12-02
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多