Django-rest-framework学习(二)Request与Response

时间:2021-02-02 14:51:12

Django-rest-framework学习(二)Request与Response

标签(空格分隔): Django web-api python


组件

Request对象

django-rest-framework中的Request对象扩展了常规的HttpRequest,它提供了request.data属性,与request.POST很类似,但是更为实用与灵活。

    request.POST  #只能处理POST方法提交的表格数据
request.data #支持处理多种方法提交的任意类型的数据

Response对象

它同时提供了response对象,是一种基于TemplateResponse类型的,可以将未处理的内容通过内容协商来决定返回给客户端的正确内容形式。( 即客户端所需要的正确形式返回,要什么样的给什么样的,不知道理解的对不对)

    return Response(data)

状态码 Status codes

由于状态码直接在代码中显示不利于代码的可读性,Django-rest-framework提供了一种更为直观的状态显示,比如HTTP_400_BAD_REQUEST

包装API视图

  • @api_view包装器用于基于函数或接口的视图
  • APIView类用于类视图

组合组件

更改视图文件

移除JSONResponse类,因为request.data可以是任意类型的数据,最终都会被处理正确响应给客户端,修改views.py如下:

    #coding:utf-8
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):
'''
显示所有的snippets的对象,或者创建一个新的对象
'''

if request.method == 'GET':
snippets = Snippet.objects.all()
serializers = SnippetSerializer(snippets, many=True)

return Response(serializers.data)

elif request.method == 'POST':
# data = JSONParser().parse(request)
serializers = SnippetSerializer(data=request.data)
if serializers.is_valid():
serializers.save()

return Response(serializers.data, status=status.HTTP_201_CREATED)
return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST)

@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.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)

修改过后,代码显得更加简洁,且状态更为直观。

提供可选择的格式化的URL后缀

提供可选择的格式化的URL后缀,意味着我们提供的API需要能够正确的响应响应的URL,比如:http://example.com/api/items/4/.json
只需要我们在接口定义处加上关键字format,例如下面:

    def snippet_list(request, format=None)
def snippet_detail(request, pk, format=None)

同时还要更新urls.py,除了原有的urlpatterns还需要增加format_suffix_patterns,如下:

    #coding:utf-8
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)

响应输出

python manage.py runserver
结果如下:

Django-rest-framework学习(二)Request与Response

由上可知,我们的响应输出格式有以下2种:
- http://127.0.0.1:8000/snippets/?format=json
- http://127.0.0.1:8000/snippets/?format=api

同样的,我们可以控制我们的请求格式,通过Content-type Header设置,po s t传入application/json 数据或者post传入multipart/form-data数据进行更新或者创建.

总结

Django-rest-framework API这个中内容的响应方式是基于客户端的,体现了强大的web-browsable,使得web接口的输出更加富有表现力。