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请求发送试试

 

     

  

 

posted on 2019-03-22 15:47  蓝同学  阅读(221)  评论(0编辑  收藏  举报

导航