从现在开始,开始接触REST框架的核心,以下介绍几个基本的构建模块:
1.Request对象
REST框架引入了一个拥有灵活请求解析的Request对象,该对象的核心功能是request.data属性,它与request.POST类似,但是request.POST只适用于POST方法,而request.data适用于"POST","PUT","PATCH"。
request.POST # 只处理表单数据 只适用于'POST'方法 request.data #处理任意数据 适用于'POST','PUT'和'PATCH'方法
2.response对象
REST框架还引入了一个response对象,这是一种TemplateResponse类型,它接受未渲染的内容,并使用内容协商来确定要返回给客户机的正确内容类型。
from rest_framework.response import Response
return Response(data) # 渲染成客户端所请求的类型
3.status模块
在视图中,如果老是使用数字来判断Http请求的话,可能不太好理解,所以它提供了个status模块,让人看了更加的清晰,如
HTTP_400_BAD_REQUEST、HTTP_201_CREATED等。
#使用的方法也很简单,导入status模块即可 from rest_framework import status status.HTTP_201_CREATED status.HTTP_400_BAD_REQUEST
4.装饰器
#REST框架提供了两个书写API视图的装饰器 //@api_view 基于函数视图的装饰器(接下来要用到的) //APIView 基于类的装饰器
5.编写视图函数(snippet_list)
在之前的snippet_list函数中,我们不再需要JSONResponse了,先将它删了,接下来我们就可以开始重构这个视图函数了
//首先导入以下依赖包 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):"""列出所有的code snippets,或创建一个新的snippet"""if request.method == "GET":snippets = Snippet.objects.all()serializer = SnippetSerializer(snippets,many=True)return Response(serializer.data)elif request.method == "POST":#观察这里的request.data,之前我们是通过JSONParser来处理json请求的#这里的request.data可以处理传入的json请求,也可以处理其他格式的请求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)
6.编写视图函数(snippet_detail)
@api_view(['GET','PUT','DELETE']) def snippet_detail(request,pk):"""获取,更新或删除一个code 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.data)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.HTTP_400_BAD_REQUEST)elif request.method == "DELETE":snippet.delete()return Response(status=status.HTTP_204_NO_CONTENT)
7.给URL添加可选的格式后缀
//我们可以给我们的API加入一个格式后缀,用来处理指定格式的URL //首先,给之前两个视图函数加入format=None这个参数 def snippet_list(request,format=None) def snippet_detail(request,pk,format=None)//接下来,在snippets/urls.py文件中,给已有的URL后加入一个format_suffix_patterns //首先别忘了导入format_suffix_patterns from rest_framework.urlpatterns import format_suffix_patternsurlpatterns = [url(r'^snippets/$', views.snippet_list),url(r'^snippets/(?P<pk>[0-9]+)/$', views.snippet_detail), ] urlpatterns = format_suffix_patterns(urlpatterns)
8.访问API来查看结果
//查看所有数据 http://127.0.0.1:8000/snippets///以JSON格式来查看所有数据 http://127.0.0.1:8000/snippets.json//查看API http://127.0.0.1:8000/snippets.api//我们可以使用Content-Type头来控制发送的请求的格式, //具体的结果可以自己写个form表单以post请求发送试试