请求和响应
# 请求和响应
# 请求对象
REST框架引入了一个扩展了常规HttpRequest
的请求对象, 并提供更灵活的请求解析。请求对象的核心功能是属性request.data
,这与request.POST
类似,但对于WebAPIs更有用。
request.POST # 只能处理post请求的表单数据
request.data # 处理所有请求的所有格式的数据
2
# 响应对象
REST framework还引入了一个响应对象,这是一种TemplateResponse
类型,它接受未渲染的内容,并使用内容协商来确定返回给客户端的正确内容类型。
return Response(data) # Renders to content type as requested by the client.
# 视图包装器
要使用REST framework的请求和响应,需要对django的视图进行包装。
REST framework提供了两个包装器:
- 装饰器
api_view
用来装饰基本的函数视图。 APIview
类用来创建类视图。
# 函数视图
接下来使用api_view
装饰器重新学生增删改查功能,代码如下:
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
@api_view(['get', 'post'])
def student_list_or_create(request):
"""
学生列表,学生创建视图
"""
if request.method == 'GET':
objs = Student.objects.all()
serializer = StudentSerializer(objs, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = StudentSerializer(data=request.data)
# 3. 校验
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view(['GET', 'PUT', 'DELETE'])
def Student_detail(request, pk):
"""
学生详情,学生更新,学生删除
"""
try:
obj = Student.objects.get(pk=pk)
except Student.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = StudentSerializer(obj)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = StudentSerializer(obj, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
obj.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
装饰器api_view
的第一个参数是个列表,表示修饰的视图函数将会处理的http
请求。
上面的代码较之前更简洁,不需要再通过request.body
处理json格式的请求,直接使用request.data
。
返回的响应使用了REST framework的Response
,并且使用了命令状态码status.HTTP_400_BAD_REQUEST
,响应的含义更加明显了。
就这。。
# 可浏览的api
使用REST framework构建的API具有类容协商的功能,它会根据客户端的请求响应不同类型的数据。
默认请情况下,当你在浏览器里访问API时,它会返回HTML格式的的内容。
这使得你的API变得可浏览,对于开发和调试非常方便。
# 为url添加可选的格式后缀
默认的内容协商是通过请求头中的Accept
来控制响应数据的格式。
http http://127.0.0.1:8000/students/ Accept:application/json # Request JSON
http http://127.0.0.1:8000/students/ Accept:text/html # Request HTML
2
还可以给API添加格式后缀的支持,使用格式后缀可以通过url明确的获取指定格式的响应。
首先向两个视图添加一个format关键字参数,如下所示。
def student_list(request, format=None):
def student_detail(request, pk, format=None):
2
现在稍微更新一下crm/urls.py
文件,在现有url之外附加一组format_suffix_patterns
。
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from projects import views
urlpatterns = [
path('students/', views.project_list),
path('students/<int:pk>', views.project_detail),
]
urlpatterns = format_suffix_patterns(urlpatterns)
2
3
4
5
6
7
8
9
10
接下来,通过添加格式后缀json
或api
就可以获取不同格式的响应了。
http http://127.0.0.1:8000/projects.json # JSON suffix
http http://127.0.0.1:8000/projects.api # Browsable API suffix
2
本文完,感谢你的耐心阅读,如有需要可加我微信,备注「博客」并说明原因,我们一起进步,下次见。
