1

クライアントがエンドポイントに HTTP HEAD リクエストを送信できるようにして、リソースが存在する場合は応答本文でリソースに応答する帯域幅を必要とせずに、リソースが存在するかどうかを確認できるようにしたいと考えています。もちろん、GET と同じように動作する必要がありますが、応答の本文は送信せず、ヘッダーのみを送信します。私は当初、これは DRF Router と ModelViewSet によって処理されると考えていましたが、この質問はそうではないことを示しています。したがって、そこに投稿された回答のアドバイスに従い、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'

この設定は head リクエストでは機能しません。get リクエストはすべて期待どおりに機能しています。興味深いことに、発生するエラーの場所と種類はクライアントによって異なります。

Postman クライアントからParse Error: The server returned a malformed response、Postman コンソールに入ります。ただし、DRF ログは、正しい応答コードを提供していることを示しており、サーバーにエラーはありません。

CURL からクライアントで正しい応答が得られますが、サーバーはリセット エラーをスローします。

ConnectionResetError: [Errno 104] Connection reset by peer

問題は、HEAD リクエストのビューで既存の retrieve メソッドを使用していることだと思います。しかし、retrieve に必要なヘッダーが既にある場合、新しいメソッドをゼロから作成する必要があるとは思えません。

どうすればこれを実装できますか? ありがとう。

4

1 に答える 1