【问题标题】:How to create Route and View for HEAD http verb in Django Rest Framework如何在 Django Rest Framework 中为 HEAD http 动词创建路由和视图
【发布时间】:2021-01-06 16:14:18
【问题描述】:

我想允许客户端向我的端点发送 HTTP HEAD 请求,以允许他们检查资源是否存在,而不需要带宽来响应响应正文中的资源(如果存在)。它当然应该与 GET 行为相同,但不发送响应的正文,只发送标头。我最初认为这将由 DRF 路由器和 ModelViewSet 处理,但this question 表明情况并非如此。因此,我遵循了那里发布的答案中的建议,并在 urls.py 和 views.py 中编写了以下内容:

项目/urls.py

urlpatterns = [
        path('api/resource/<str:value>', views.ResourceViewSet.as_view(actions={'head': 'retrieve', 'get': 'retrieve'})),

app/views.py

class ResourceViewSet(viewsets.ModelViewSet):
    serializer_class = serializers.ResourceSerializer
    queryset = Resource.objects.all()
    lookup_field = 'value'

此设置不适用于头部请求。获取请求都按预期工作。有趣的是,我得到的错误的位置和类型取决于客户端:

从 Postman 客户端,我在 Postman 控制台中得到 Parse Error: The server returned a malformed response。然而,DRF 日志显示它给出了正确的响应代码,并且服务器上没有错误。

从 CURL 我在客户端得到正确的响应,但服务器抛出一个重置错误:

ConnectionResetError: [Errno 104] Connection reset by peer

我认为问题在于我在 HEAD 请求的视图中使用现有的检索方法。但是当retrieve已经有我需要的标头时,我也不能认为我应该从头开始编写一个新方法。

我该如何实现呢?谢谢。

【问题讨论】:

    标签: python django django-rest-framework http-headers


    【解决方案1】:

    我找到了解决方案,并且对问题所在有一个很好的理论。看起来只是让客户感到困惑的内容长度标头。 Postman 出错了,因为它总是期望响应 HEAD 请求的内容长度为 0(如果我正确理解 RFC,这是 Postman 的错误),而 curl 和服务器只是对连接是否仍然感到困惑打开,因为有一个非零内容长度标头,但没有内容通过。同样,这很奇怪,但我不是专家,所以无论如何。这是我正在工作的实现(请注意,如果我在 Response 对象中放置一个空字符串,那么我仍然会收到错误消息。我必须只放置一个状态代码):

    from django.http import Http404
    class ResourceViewSet(viewsets.ModelViewSet):
        serializer_class = serializers.ResourceSerializer
        queryset = Resource.objects.all()
        lookup_field = 'value'
    
        def exists(self, request, *args, **kwargs):
            try:
                _ret = self.retrieve(request, *args, **kwargs)
                return Response(status=status.HTTP_200_OK)
            except Http404 as e:
                return Response(status=status.HTTP_404_NOT_FOUND)
    

    在 urls.py 中,我将 head 请求定向到 exists 方法。

    【讨论】:

      猜你喜欢
      • 2018-07-22
      • 1970-01-01
      • 2015-01-23
      • 2013-02-17
      • 1970-01-01
      • 2021-07-24
      • 2014-05-10
      • 1970-01-01
      • 2019-10-07
      相关资源
      最近更新 更多