从Django Rest Framework简单JWT令牌(第三方)获取中间件中的用户名

从Django Rest Framework简单JWT令牌(第三方)获取中间件中的用户名,django,django-rest-framework,jwt,django-rest-framework-jwt,Django,Django Rest Framework,Jwt,Django Rest Framework Jwt,我使用的是Django Rest框架,其中包含了一个名为的第三方包,它是引用的新框架, 这是一个老版本(我想是吧),因为github很久没有更新了,可能新版本也不支持 我正在寻找一种方法,像这样,通过中间件,获取每个请求的用户信息,以便在需要时使用django信号在我的模型中应用/保存用户对象。 我查阅了文档和互联网,但什么也没找到。所以,如果你已经有了这个案子,我会感谢你的帮助 谢谢那么是什么阻止了你?django中间件框架非常好。你基本上需要遵循这些文件,你就会实现你想要的。换句话说,您需要

我使用的是Django Rest框架,其中包含了一个名为的第三方包,它是引用的新框架, 这是一个老版本(我想是吧),因为github很久没有更新了,可能新版本也不支持

我正在寻找一种方法,像这样,通过中间件,获取每个请求的用户信息,以便在需要时使用django信号在我的模型中应用/保存用户对象。 我查阅了文档和互联网,但什么也没找到。所以,如果你已经有了这个案子,我会感谢你的帮助


谢谢

那么是什么阻止了你?django中间件框架非常好。你基本上需要遵循这些文件,你就会实现你想要的。换句话说,您需要创建一个接受请求实例的中间件。然后,您可以通过
request.user
访问该用户,并对其执行任何操作

注意:请确保将中间件放在AuthenticationMiddleware之后

编辑: 实际上,您无法通过django中间件获得经过身份验证的DRF用户,因为身份验证不是以“正常”django的方式完成的。 因此,一种方法是创建一个Mixin,在所有APIView-s中覆盖并使用该Mixin,或者您可以简单地扩展APIView并覆盖perform_身份验证

class CustomAPIView(APIView):
    def perform_authentication(self, request):
        request.user
        #Do what you like with the request.user

要从用户模型中获取用户名,应使用request.user。这将为您提供请求中经过身份验证的用户信息。但是,如果您使用simple_jwt,就不可能在中间件中直接使用request.user,因为身份验证机制在view函数中工作

因此,您应该在中间件内部手动进行身份验证,然后可以使用request.user从用户模型中获取任何数据

from rest_framework_simplejwt import authentication


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

    def __call__(self, request):
        response = self.get_response(request)
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        request.user = authentication.JWTAuthentication().authenticate(request)[0]  # Manually authenticate the token

        print(request.user)  # Use the request.user as you want

我认为它不会起作用,因为我已经尝试过:def myown中间件(get_response):def中间件(request):#做你想做的…#比如get user=user.objects.get(username=request.user)#。。。。response=get_response(request)return-response返回中间件当然我最后把myown中间件放在了中间件中。也许,您的意思是process_请求与上面的代码片段有不同的行为?我确认,它与process_视图不起作用,您得到的是AnonymousUser,因为django和django Rest Framework之间使用的后端身份验证不同。Upvote是唯一一个真正将用户放入请求对象的人(因此,这是唯一正确的答案,IMO)。但是,值得注意的是,这应该被视为一种变通方法,因为它最终会在身份验证代码中被调用两次……因此,最好修改代码以完成实际视图中所需的工作,而不是在中间件中。