Drf官网教程(二) - Request,Response &a
2018-06-23 本文已影响106人
dyq666
目录
- Request对象
- Response对象
- 状态码
- Drf中的APIView
- 为Url添加可选择的后缀
- 测试多样性的后缀
1. Request对象
Drf的Request对象是在Django的HttpRequest对象上进行了功能的扩展。最核心的功能就是request.data
。
- Django中当请求的Method是
POST
时,使用request.POST
能获取请求中的表单数据。 - Drf中无论是
POST
,PUT
,PATCH
中的哪种Method,都使用request.data
获取请求中的表单数据。
2. Response对象
使用Response对象时只需要传入数据即可,Response会自动返回客户端需要的类型。
- Django中返回时需要判断使用
HttpResponse
还是JsonResponse
。 - Drf中只需要使用
Response
,不需要抉择。
具体使用方法:
def xxx():
...
return Response(data)
3. 状态码
-
Django中使用数字作为状态码。例如:
from django.http import HttpResponse
def xxx():
...
return HttpResponse(status=400)
-
Drf中使用文字+数字的方式。例如:
from rest_framework import status
from rest_framework.response import Response
def xxx():
...
return Response(status=status.HTTP_400_BAD_REQUEST)
4. Drf中的APIView
-
Drf提供了两种方式让Django的view变成Drf的APIView:
- FBV(基于函数的):
@api_view
,在使用时需要注明需要使用哪些HTTP-METHOD,例如使用GET
和POST
时需要使用这种装饰器:@api_view(['GET', 'POST'])
- CBV(基于类的):View类继承
APIView
- FBV(基于函数的):
-
使用APIView的好处:
- 确保接受和返回的时都可以使用Drf提供的
Request
和Response
- 会自动处理序列化章节中View部分提到的未完善的部分,例如Json格式不对,Method无法处理,解析失败等情况(会自动返回对应的错误码,不用再手动处理)。
- 确保接受和返回的时都可以使用Drf提供的
-
更改View部分
阅读代码前需要注意以下几点:
1. 返回时,Django中状态码的默认值是200(上一章没有提到这点,所有status都是指明的,没有使用默认值),Drf也继承了这个观念,状态码的默认值是status.HTTP_200_OK
2. 获取的字节流不用再通过Json解析,request.data
中存放了Json解析后的值。
3. 其余更改部分都是上文提到的。例如装饰器,返回对象,状态码。
from rest_framework import status
from rest_framework.response import Response
from rest_framework.decorators import api_view
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
@api_view(['GET', 'POST'])
def snippet_list(request):
"""list, create"""
if request.method == 'GET':
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
# 改状态码
return Response(serializer.data)
elif request.method == 'POST':
# 取消了用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)
@api_view(['GET', 'PUT', 'DELETE'])
def snippet_detail(request, pk):
"""retrieve, update, delete"""
try:
snippet = Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
# 不用再判断是返回JsonResponse还是普通的HttpResponse
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
# retrieve
serializer = SnippetSerializer(snippet)
return Response(serializer.data)
elif request.method == 'PUT':
# update
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()
# 204不返回内容
return Response(status=status.HTTP_204_NO_CONTENT)
5. 为Url添加可选择的后缀
例如可以让数据显示为Html,显示为Json。(具体部分在下面测试中将展示)
- 为view增加一个参数
format
,官网推荐的值为None
def snippet_list(request, format=None):
...
def snippet_detail(request, pk, format=None):
...
- 修改
snippets\urls.py
...
from rest_framework.urlpatterns import format_suffix_patterns
...
urlpatterns = format_suffix_patterns([
...
])
6. 测试多样性的后缀
与第一章相同可用两种方式来进行测试:终端和网页。
-
网页测试
在这里先介绍网页版的原因是通常都会使用网页版来进行测试,因为不用额外的记一些命令。
启动Django后打开http://127.0.0.1:8000/snippets/
就可以看到Drf为我们提供的BrowserAPI。
简单的讲解下网页中的内容,GET按钮下可以选择api或者是json。OPTIONS则是获取头信息,下方可以提交表单。
-
终端测试(不常用)
- 使用header参数-Accept
http http://127.0.0.1:8000/snippets/ Accept:application/json # Request JSON
http http://127.0.0.1:8000/snippets/ Accept:text/html # Request HTML
- 使用后缀
http http://127.0.0.1:8000/snippets.json # JSON suffix
http http://127.0.0.1:8000/snippets.api # Browsable API suffix
- 提交表单
# POST using form data
http --form POST http://127.0.0.1:8000/snippets/ code="print 123"
# POST using JSON
http --json POST http://127.0.0.1:8000/snippets/ code="print 456"