一、请求和响应对象介绍
REST framework引入了2个新的对象:Request和Response
1.1、Request
rest_framework.request.Request
该对象扩展了常规的HttpRequest ,增加了对REST框架灵活的请求解析和请求认证的支持
官网:Requests - Django REST framework
主要属性:
-
data
这个属性类似django的request的POST和FILES属性:
-
django的request.POST:只能获取POST请求的form表单数据
-
rest_framework的request.data:
- 包括所有已解析的内容,包括文件和非文件输入
- 支持'POST', 'PUT' 和'PATCH' 方法
- 支持REST框架的灵活请求解析,而不仅仅支持表单数据。例如,可以传入JSON数据
-
-
query_params
就是标准的request.GET属性,不过从命名角度来说,更加合理,因为不是只有GET请求才有GET查询参数
1.2、Response
rest_framework.response.Response
网站:Responses - Django REST framework
该类是Django的 SimpleTemplateResponse 的子类,使用python原始对象进行数据初始化,然后,REST框架使用标准HTTP内容协商来确定它应如何呈现最终的响应内容
1.2.1、初始化
Response(data, status=None, template_name=None, headers=None, content_type=None)
data
:响应的序列化数据,如果是复杂对象,如模型实例,需要在传入之前序列化为原始数据类型(如dict等)status
:响应的状态代码,默认为200template_name
:HTMLRenderer
选择时使用的模板名称headers
:要在响应中使用的HTTP标头的字典content_type
:响应的内容类型。通常,这将由内容协商确定的渲染器自动设置,但在某些情况下您可能需要明确指定内容类型
1.2.2、属性
-
data:响应的未呈现的序列化数据
-
status_code:响应状态码,建议使用HTTP_200_OK 这样的常量,而不是 200 这样的数字,常量给每个状态代码提供更明确的标识符
-
content:渲染后的响应内容,调用此属性前需要调用.render()方法渲染
-
template_name:指定的模板名
-
accepted_renderer:将用于呈现响应的呈现器实例,在视图返回响应之前由
APIView
或@api_view
自动设置 -
accepted_media_type:内容协商阶段选择的媒体类型,在视图返回响应之前由
APIView
或@api_view
自动设置 -
renderer_context:需要渲染的上下文字典对象,在视图返回响应之前由
APIView
或@api_view
自动设置
二、视图API包装器-@api_view
官网:2 - Requests and responses - Django REST framework
框架使用了2个包装 API视图 的包装器:
-
@api_view:用于处理基于函数的视图的装饰器
rest_framework.decorators.api_view
-
APIView:用于处理基于类的视图
rest_framework.views.APIView
2.1、代码
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view
from rest_framework.response import Response
# Create your views here.
@api_view(['GET','POST'])
# 直观的显示支持的请求方法,不用再写if request.method == 'GET'了,可以配合rest_framework的Response返回json数据
def index(request):
# return HttpResponse('测试API_View包装器')
return Response('测试API_View包装器') # 提供了GUI界面,界面里可以操作数据
三、RESTFramework的GUI界面
RESTFrame的视图包装器与Response的结合使用提供的GUI界面,可以对数据进行CRUD,但是后台逻辑操作还是由我们自己开发,具体步骤如如:
-
实现数据的增删改查操作代码
-
使用视频包装器包装视图
-
数据的结果返回rest_framework.response.Response
3.1、代码
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .models import Student
from .serializers import StudentSerializer
'''
数据的增删改查
操作 URL HTTP方法
添加数据 /students/ POST
修改数据 /student/<int:pk>/ PUT
删除数据 /student/<int:pk>/ DELETE
查询数据 /students/ GET
查询单个数据 /student/<int:pk>/ GET
'''
# Create your views here.
@api_view(['GET','POST'])
def students(request):
# 根据请求方法进行不同的操作
if request.method == 'GET':
# 查询所有数据
stus = Student.objects.all()
# 将数据转换为json格式, stus是一个列表,many代表要转换的数据是一个列表
ser =StudentSerializer(stus,many=True)
return Response(ser.data)
elif request.method == 'POST':
# 添加数据
# 获取请求体中的数据
'''
这个写法不能用
# data = JSONParser().parse(request)
# 将数据转换为模型对象
# ser = StudentSerializer(data=data)
'''
ser = StudentSerializer(data=request.data)
# 验证数据,如果验证通过,则保存数据
if ser.is_valid():
# 保存数据
ser.save()
return Response(ser.data)
else:
# 验证失败,返回错误信息
return Response(ser.errors,status=400)
@api_view(['GET','PUT','DELETE'])
def student(request,pk):
# 查询单个数据
try:
stu = Student.objects.get(pk=pk)
except Student.DoesNotExist:
return Response({'error':'数据不存在'},status=404)
# 根据请求方法进行不同的操作
if request.method == 'GET':
# 将数据转换为json格式
ser = StudentSerializer(stu)
return Response(ser.data,status=200)
elif request.method == 'PUT':
# 修改数据
ser = StudentSerializer(stu,data=request.data)
# 验证数据,如果验证通过,则保存数据
if ser.is_valid():
# 保存数据
ser.save()
return Response(ser.data,status=status.HTTP_201_CREATED)
else:
# 验证失败,返回错误信息
return Response(ser.errors,status=400)
elif request.method == 'DELETE':
# 删除数据
stu.delete()
return Response({'msg':'删除成功'},status=204)