gpt4 book ai didi

python - 在 get_queryset 中返回一个 Http 响应

转载 作者:行者123 更新时间:2023-12-02 17:03:08 25 4
gpt4 key购买 nike

我在 ListAPIView 中使用 get_queryset

我想检查用户的访问 token ,在提供列表之前,我做了以下操作,但问题是 get_query 集不返回响应,是否有返回响应的方法,或者我应该使用替代方法:

这是我在 views.py 中的类(class):

class ListProductsOfCategory(generics.ListAPIView):
serializer_class = ProductSerializer
lookup_url_kwarg = 'category_id'

def get_queryset(self):
# I get the token here from the headers
token = self.request.META.get("HTTP_TOKEN", "")
if not token:
return Response(
data={
"message": "no token!"
},
status=status.HTTP_400_BAD_REQUEST
)
if not UserAccess.objects.filter(accessToken=token).exists():
return Response(
data={
"message": "invalid token!"
},
status=status.HTTP_400_BAD_REQUEST
)
category_id = self.kwargs.get(self.lookup_url_kwarg)
return Product.objects.filter(category_id=category_id)

请注意,如果我删除了与 token 相关的部分,一切都会完美无缺。

提前致谢。

上次更新后,这是回复:

enter image description here

最佳答案

我建议您将检查 token 逻辑移动到 dispatch() 方法中。这是一个比 get_queryset 更好的地方。或者更好的是编写您自己的身份验证类以便在 View 之间共享它。

通过一些修复(参见更新的 get_queryset()),它可以是:

更新

我认为您可以使用内置的 restframework.exceptions.AuthenticationFailed。如果您不满意default DRF exceptions您可以创建自己的自定义异常。例如在 exceptions.py 的某处:

from rest_framework.exceptions import APIException

class MissingTokenException(APIException):
status_code = 400
default_detail = 'Your request does not contain token'
default_code = 'no_token'

class InvalidTokenException(APIException):
status_code = 400
default_detail = 'Your request contain invalid token'
default_code = 'invalid_token'

然后你就可以在views.py中使用它们了:

from rest_framework import serializers
from .exceptions import MissingTokenException, InvalidTokenException

class ListProductsOfCategory(generics.ListAPIView):
serializer_class = ProductSerializer
lookup_url_kwarg = 'category_id'

def dispatch(self, *args, **kwargs):
token = self.request.META.get("HTTP_TOKEN", "")
if not token:
raise MissingTokenException
if not UserAccess.objects.filter(accessToken=token).exists():
raise InvalidTokenException
return super().dispatch(*args, **kwargs)

def get_queryset(self):
qs = super().get_queryset()
category_id = self.kwargs.get(self.lookup_url_kwarg)
return qs.filter(category_id=category_id)

关于python - 在 get_queryset 中返回一个 Http 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53114625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com