基类 APIView
rest_framework.views.APIView
: 是REST framework提供的所有视图的基类,继承自Django的View
父类。-
APIView
与View
的不同之处在于:- 接收的是REST framework的
Request
对象,而不是Django的HttpRequeset
对象; - 视图方法可以返回REST framework的
Response
对象,视图会为响应数据设置(render)符合前端要求的格式; - 处理请求前会对请求进行身份认证、权限检查、流量控制
- 任何APIException异常都会被捕获到,并且处理成合适的响应信息;
- 接收的是REST framework的
-
APIView
支持定义的属性:authentication_classes
列表或元组,身份认证类permissoin_classes
列表或元组,权限检查类throttle_classes
列表或元组,流量控制类
案例: APIView
结合 序列化器 使用
# users/urls.py
url(r'^departments/$', views.DepartmentListAPIView.as_view()),
url(r'^departments/(?P<pk>\d+)/$', views.DepartmentDetailAPIView.as_view()),
# users/views.py
class DepartmentListAPIView(APIView):
def get(self, request):
"""查询多条数据"""
# 查询所有的部门对象
query_set = Department.objects.all()
# 创建序列化器(当传入的对象有多个时需要指定many=True)
serializer = DepartmentSerializer(query_set, many=True)
# 返回响应对应
return Response(serializer.data)
def post(self, request):
"""新增一条数据"""
# 创建序列化对象
serializer = DepartmentSerializer(data=request.data)
# 验证参数合法性
# 设置raise_exception=True后,出错时,会给客户端返回json出错信息
serializer.is_valid(raise_exception=True)
# 保存部门到数据库表中
serializer.save()
# 返回响应对象
return Response(serializer.data)
class DepartmentDetailAPIView(APIView):
def get(self, request, pk):
"""查询一条数据"""
try:
department = Department.objects.get(pk=pk)
except Department.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
# 创建序列化对象
serializer = DepartmentSerializer(department)
# 返回响应对象,并传递字典数据
return Response(serializer.data)
def put(self, request, pk):
"""修改部门"""
# 要修改的部门对象
try:
department = Department.objects.get(pk=pk)
except Department.DoesNotExist:
return HttpResponse(status=status.HTTP_404_NOT_FOUND)
# 创建序列化器对象
serializer = DepartmentSerializer(department, data=request.data)
# 验证参数合法性
# raise_exception=True: 如果校验不通过,会返回json出错信息给客户端
serializer.is_valid(raise_exception=True)
# 保存数据到数据库中
# 上面的代码,当创建DepartmentSerializer对象时,第一个参数传入了部门对象,
# 则在调用save()方法时,会修改部门,如果没有传入对象,则会新增部门
serializer.save()
return Response(serializer.data)
def delete(self, request, pk):
# 删除一个部门 DELETE /departments/<pk>
# 查询要删除的部门对象
try:
department = Department.objects.get(pk=pk)
except Department.DoesNotExist:
return Response(status=404)
# 删除部门
department.delete()
# 响应请求
return Response(status=204)