官网地址python
这一章将开始覆盖Rest framework的核心。让咱们来介绍一些基础组件。web
Rest framework 引入了一个继承于django HttpRequest
的对象Request
,并提供更灵活的解析。Request
的核心是request.data
属性,他相似于request.POST
,但对web api更有用。django
request.POST #只处理form data,并且只适用于'POST'方法 request.data #处理全部数据,适用于 'POST','PUT','PATCH'
Rest framework 也引入了Response
对象,它是一个TemplateResponse
类型,并根据客户端需求正确返回须要的类型。json
return Response(data) # 根据客户端的需求返回不一样的类型。
在你的views
中使用HTTP状态码,老是不太容易阅读的,并且稍不注意,你会返回一个错误的状态码。Rest framework为每一个状态码提供了更为明确的标识符。例如 status
模块中的 HTTP_400-BAD_REQUEST
。api
REST framework为你提供了两个装饰器,你可以使用它们来写你的API views。url
@api_view
装饰器适用于function based viewsAPIView
装饰器适用于 class-based viewsRequest
,并将上下文添加到Response
当中,这样就能根据客户端的须要返回。装饰器还提供行为,例如适当的时候返回405 Method Not Allowed
和当访问request.data或者输入错误时,处理全部的'ParseError'异常。rest
好,来开始使用新的组件来写咱们的views。
咱们不再须要在views.py
中使用JSONResonse
了。咱们来开始重构咱们的views.code
from rest_framework import status from rest_framework.decorators import api_view from rest_framework.response import Response from snippets.models import Snippet from snippets.serializers import SnippetSerializer @api_view(['GET', 'POST']) def snippet_list(request): """ List all snippets, or create a new snippet. """ if request.method == 'GET': snippets = Snippet.objects.all() serializer = SnippetSerializer(snippets, many=True) return Response(serializer.data) elif request.method == 'POST': serializer = SnippetSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
咱们所展现的示例view和以前相比,有了至关大的进展。它更小更简洁,若是咱们正在使用Form API,会发现这个代码很是的类似。咱们也可以使用 named status codes
。orm
接下来,咱们将在views.py
模块中展现一个snippet的详情。对象
@api_view(['GET','PUT','DELETE']) def snippet_detail(request,pk) ''' 检索,更新或者删除一个snippet ''' try: snippet = Snippet.objects.get(pk=pk) except Snippet.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) if request.method == "GET": serializer = SnippetSerializer(snippet) return Response(serializer.date) elif request.method == "PUT": serializer = SnippetSerializer(snippet,data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors,status=status.HTPP_400_BAD_REQUEST) elif request.method == "DELETE": snippe.delete() return Response(status.status.HTTP_204_NO_CONTENT)
这一切都应该感受特别熟悉-它和标准的Django views没多少不一样。
注意:咱们再也不明确指定 request和response的响应类型。request.data
可以处理全部进来的json
请求,但他也可以处理其余的格式。一样,咱们在response中返回咱们的数据,可是由REST framework 来帮助咱们来为不一样的请求作出正确的响应内容。
为咱们刚才编写的两个view添加url.
def snippet_list(request,format=None)
def snippet_detail(request,pk,format=None)
如今,咱们稍微修改一下咱们的urls.py
文件。
from django.conf.urls import url from rest_framework.urlpatterns import format_suffix_patterns from snippets import views urlpatterns = [ url(r'^snippets/$',views.snippet_list), url(r'^snippets/(?P<pk>[0-9]+)$',views.snippet_detail), ] urlpatterns = format_suffix_patterns(urlpatterns)
咱们不是必需要添加这些额外的url patterns,可是它给咱们一个简单,干净的特定格式。