【发布时间】: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