自定义 Django SimpleJWT 视图
Customized Django SimpleJWT Views
我正在使用 django-simplejwt 并且我有一个自定义令牌视图来获取令牌。我的问题是,如何覆盖视图中的 401 Unauthorized 响应?
https://django-rest-framework-simplejwt.readthedocs.io/en/latest/customizing_token_claims.html
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
class ObtainTokenSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
# Add custom claims
token['name'] = user.first_name
# ...
return token
class ObtainToken(TokenObtainPairView):
serializer_class = ObtainTokenSerializer
答案可能存在于引发的异常中。
当您深入研究 simplejwt 包时,您会看到如下内容:
class InvalidToken(AuthenticationFailed):
status_code = status.HTTP_401_UNAUTHORIZED
default_detail = _('Token is invalid or expired')
default_code = 'token_not_valid'
这是您看到的 401 的来源。
因此你的 class ObtainToken
应该用你特定的 Exception
或 Response
.
例如:
from rest_framework import status
...
class ObtainToken(TokenObtainPairView):
serializer_class = ObtainTokenSerializer
...
def post(self, request):
serializer = self.serializer_class(
data=request.data,
context={'request': request}
)
try:
serializer.is_valid()
return Response(
serializer.validated_data,
status=status.HTTP_200_OK
)
except Exception:
return Response(status=status.HTTP_404)
尽管以上只是一个示例,您应该实现与 TokenViewBase
中的 post 方法类似的东西,但使用您自定义的状态和数据。
我正在使用 django-simplejwt 并且我有一个自定义令牌视图来获取令牌。我的问题是,如何覆盖视图中的 401 Unauthorized 响应?
https://django-rest-framework-simplejwt.readthedocs.io/en/latest/customizing_token_claims.html
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
class ObtainTokenSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
# Add custom claims
token['name'] = user.first_name
# ...
return token
class ObtainToken(TokenObtainPairView):
serializer_class = ObtainTokenSerializer
答案可能存在于引发的异常中。
当您深入研究 simplejwt 包时,您会看到如下内容:
class InvalidToken(AuthenticationFailed):
status_code = status.HTTP_401_UNAUTHORIZED
default_detail = _('Token is invalid or expired')
default_code = 'token_not_valid'
这是您看到的 401 的来源。
因此你的 class ObtainToken
应该用你特定的 Exception
或 Response
.
例如:
from rest_framework import status
...
class ObtainToken(TokenObtainPairView):
serializer_class = ObtainTokenSerializer
...
def post(self, request):
serializer = self.serializer_class(
data=request.data,
context={'request': request}
)
try:
serializer.is_valid()
return Response(
serializer.validated_data,
status=status.HTTP_200_OK
)
except Exception:
return Response(status=status.HTTP_404)
尽管以上只是一个示例,您应该实现与 TokenViewBase
中的 post 方法类似的东西,但使用您自定义的状态和数据。