Django Rest Framework学习进程(二) 请求与响应
从现在开始,开始接触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_patterns urlpatterns = [ 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请求发送试试