我正在使用Django Rest Framework,并且包含了一个名为REST framework simple JWT Auth的第三方程序包,它是所引用的新框架, 而这个REST framework JWT Auth是旧的(我想像),因为很长一段时间以来github上都没有更新,并且可能不支持较新的版本。
我正在寻找一种方法,例如link on stackoverflow-3rd answer,通过中间件来获取每个请求的用户信息,以便在需要时通过使用以下方式在我的模型中应用/保存用户对象: django信号。 我检查了文档并在Internet上找到了东西,但没有找到任何东西。因此,如果您已经遇到这种情况,我们将不胜感激。
谢谢
答案 0 :(得分:2)
那是什么阻止了你? django中间件框架很好documented。您基本上需要遵循文档,您将实现您想要的。换句话说,您需要创建一个带有请求实例的中间件。然后,您将可以通过request.user
访问该用户并对其进行任何操作。
NB确保将中间件放在AuthenticationMiddleware之后。
编辑: 实际上,您无法通过django中间件获得经过身份验证的DRF用户,因为身份验证不是以“常规” django的方式完成的。 因此,一种实现方法是创建一个覆盖perform_authentication的Mixin,并在所有您的APIView-s中使用该mixin,或者您可以简单地扩展APIView并覆盖perform_authentication。
class CustomAPIView(APIView):
def perform_authentication(self, request):
request.user
#Do what you like with the request.user
答案 1 :(得分:0)
要从用户模型中获取用户名,应使用request.user。这将为您提供请求中经过身份验证的用户的信息。但是,如果您使用simple_jwt,则无法在中间件中直接使用request.user,因为身份验证机制在视图功能中起作用。
因此,您应该在中间件内部进行手动身份验证,然后可以使用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