在 Django Rest Framework 中包含一个位置标头

Dea*_*ada 6 django django-rest-framework

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

我使用 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()
Run Code Online (Sandbox Code Playgroud)

网址.py

from django.conf.urls import url, include

from store import views

urlpatterns = [
    url(r'^artists/', views.artist, name='artists-list'),
]
Run Code Online (Sandbox Code Playgroud)

聚苯乙烯

每次我使用 Advanced REST Client 发出请求时,我收到的响应如下:

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
Run Code Online (Sandbox Code Playgroud)

sol*_*oke 7

您可以向对象添加任意标题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
Run Code Online (Sandbox Code Playgroud)