【问题标题】:Include a location header in Django Rest Framework在 Django Rest Framework 中包含位置标头
【发布时间】:2016-11-27 05:10:01
【问题描述】:

我在一篇文章中读到,理想的做法是包含一个指向新资源 URL(通过 POST 新创建)的 Location 标头是一个很好的标准。我的问题是我不知道如何包含它。

我正在使用 APIView 使用基于类的视图,我在视图中的代码是:

class ListArtists(APIView):
    serializer_class = ArtistSerializer
    def get(self, request, format=None):
        _array = Artist.objects.filter()
        serializer = self.serializer_class(_array, many=True)
        if serializer.data:
            _status = status.HTTP_200_OK
        else:
            _status = status.HTTP_204_NO_CONTENT
        return Response(standardResponse(data=serializer.data), status=_status)

    def post(self, request, format=None):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(standardResponse(data=serializer.data), status=status.HTTP_201_CREATED)
        else:
            return Response(standardResponse(errors=serializer.errors))
artist = ListArtists.as_view()

urls.py

from django.conf.urls import url, include

from store import views

urlpatterns = [
    url(r'^artists/', views.artist, name='artists-list'),
]

附言

每次我使用高级 REST 客户端发出请求时,我都会收到以下响应:

Date: Sat, 23 Jul 2016 10:54:23 GMT
Server: WSGIServer/0.1 Python/2.7.10
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Allow: GET, POST, HEAD, OPTIONS

【问题讨论】:

标签: django django-rest-framework


【解决方案1】:

您可以将add arbitrary headers 转换为Response 对象,如下所示:

def post(self, request, format=None):
    serializer = self.serializer_class(data=request.data)
    if serializer.is_valid():
        obj = serializer.save()
        response = Response(standardResponse(data=serializer.data), 
                            status=status.HTTP_201_CREATED)
        # If you have defined a get_absolute_url method on your model, then
        # you can use that to get a URL for the new object
        response['Location'] = obj.get_absolute_url()
        return response

【讨论】:

  • 现在这就是我正在寻找的答案!谢谢!
  • 嗨,我们还可以在 DRF 中手动删除任何标题字段吗?如果可以,请在此处说明一下:- stackoverflow.com/questions/68706989/…
【解决方案2】:

对于那些使用drf CreateModelMixin 的人,view 必须看起来像这样:

如果您确实想要响应中的空正文:

class MyView(mixins.CreateModelMixin, generics.GenericAPIView):

    serializer_class = MySerializer

    def post(self, request, *args, **kwargs):
        default_response = self.create(request, *args, **kwargs)
        return Response(headers={'Location': reverse("get_enpoint_name", args=[default_response.data['id']], request=self.request)})

如果响应正文必须包含序列化程序中指定的对象数据:

class MyView(mixins.CreateModelMixin, generics.GenericAPIView):

    serializer_class = MySerializer

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

    def get_success_headers(self, data):
        try:
            return {'Location': reverse("customer", args=[data['id']], request=self.request)}
        except (TypeError, KeyError):
            return {}

随时欢迎改进!

【讨论】:

    猜你喜欢
    • 2015-11-19
    • 2016-12-29
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多