一、概述

APIView是rest_frame框架提供的一个视图类,该视图类继承自Django.views中的View类。

  • 请求:使用框架定义的Request方法,而不是Django的HttpRequest方法
  • 响应:使用框架定义的Response方法,而不是Django的HttpResponse方法
  • 异常处理:使用框架定义的APIException
  • 提供认证、权限、限流等功能

    二、Request请求

    获取参数的方式:

  • get请求:request.query_params.get(‘参数名’),Django中使用的是request.GET.get()

  • post请求:request.data,Django中使用的是request.POST.get()或者request.body

    (一)、get请求

  • get请求直接在url后?拼接参数名=参数值,多个参数之间使用&连接

  • url的path中不需要设置参数,如果设置参数会报错找不到 ```python from rest_framework.views import APIView from django.http import HttpResponse

class UserView(APIView): “”” 视图 “””

  1. def get(self, request, *args, **kwargs):
  2. print(request.query_params.get('id'))
  3. return HttpResponse('成功')
#

urls.py from django.urls import path from . import views

urlpatterns = [ path(‘info’, views.UserView.as_view(), name=”addInfo”), ]

  1. <a name="C3C94"></a>
  2. #### (二)、post请求
  3. - 可以传递json格式的数据,request.data获取到的数据是字典格式的,例如:{'username': '黎明', 'password': '213415131'}
  4. - 也可以通过表单格式传递数据,request.data获取到的是QueryDict,例如:<QueryDict: {'username': ['黎明']}>
  5. ```python
  6. from rest_framework.views import APIView
  7. from django.http import HttpResponse
  8. class UserView(APIView):
  9. """ 视图 """
  10. def post(self, request, *args, **kwargs):
  11. print(request.data)
  12. return HttpResponse('成功')
  13. #################
  14. urls.py
  15. from django.urls import path
  16. from . import views
  17. urlpatterns = [
  18. path('info', views.UserView.as_view(), name="addInfo"),
  19. ]

三、Response响应

  • 继承自rest_framework中的views模块
  • 返回内容格式更加的灵活多样,包括:

    • 文字

      1. from rest_framework.response import Response
      2. class UserView(APIView):
      3. """ 视图 """
      4. def post(self, request, *args, **kwargs):
      5. print(request.data)
      6. return Response("成功")
    • json数据

      1. from rest_framework.response import Response
      2. class UserView(APIView):
      3. """ 视图 """
      4. def post(self, request, *args, **kwargs):
      5. print(request.data)
      6. return Response({"message": "成功"})
    • 列表数据

      1. from rest_framework.response import Response
      2. class UserView(APIView):
      3. """ 视图 """
      4. def post(self, request, *args, **kwargs):
      5. print(request.data)
      6. return Response([{"message": "成功"}, {"name": "..."}])
  • 提供了一个完整详细的状态码模块,通过rest_framework中的status来调用,每一个状态码的名字中都有对状态码的解释,在开发中更加的友好,更加容易理解状态码代表的含义 ```python from rest_framework.response import Response from rest_framework import status class UserView(APIView): “”” 视图 “””

    def post(self, request, args, *kwargs):

    1. print(request.data)
    2. return Response([{"message": "成功"}, {"name": "..."}], status=status.HTTP_200_OK)
  1. <a name="bPIv7"></a>
  2. ### 四、APIView实现列表视图
  3. <a name="3wMJ1"></a>
  4. #### (一)、从数据库获取所有的数据信息
  5. - 模型对象
  6. - 序列化器对象,instance和many=True两个参数
  7. - 返回数据, 直接使用serializer.data返回数据,不需要额外的进行数据格式的转换,Django中的HttpResponse必须进行数据格式的转换
  8. ```python
  9. from rest_framework.views import APIView
  10. from rest_framework.response import Response
  11. from rest_framework import status
  12. from .models import UserProfile
  13. from .serializers import UserProfileSerializers
  14. class UserListView(APIView):
  15. """ 列表视图 """
  16. def get(self, request, *args, **kwargs):
  17. users = UserProfile.objects.all()
  18. serializer = UserProfileSerializers(instance=users, many=True)
  19. return Response(serializer.data, status=status.HTTP_200_OK)

(二)、向数据库中插入一条数据

  • 获取数据:request.data
  • 创建序列化器对象,参数data=获取的数据
  • 校验数据:is_valid(raise_exception=True)
  • 创建数据:序列化器对象.save(),不需要去重写create()方法了
  • 返回数据 ```python from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .models import UserProfile from .serializers import UserProfileSerializers

class UserListView(APIView): “”” 列表视图 “””

  1. def post(self, request, *args, **kwargs):
  2. serializer = UserProfileSerializers(data=request.data)
  3. serializer.is_valid(raise_exception=True)
  4. serializer.save()
  5. return Response(serializer.data, status=status.HTTP_201_OK)
  1. <a name="r4ZSz"></a>
  2. ### 五、APIView实现详情视图
  3. <a name="BOlAH"></a>
  4. #### (一)、查询单条数据详情信息
  5. - 通过id或者pk获取该数据对象
  6. - 创建序列化器对象,参数是instance
  7. - 返回数据和状态码
  8. ```python
  9. from rest_framework.views import APIView
  10. from rest_framework.response import Response
  11. from rest_framework import status
  12. from .models import UserProfile
  13. from .serializers import UserProfileSerializers
  14. class UserDetailView(APIView):
  15. """ 详情视图 """
  16. def get(self, request, pk):
  17. user = UserProfile.objects.get(pk=pk)
  18. if user:
  19. serializer = UserProfileSerializers(instance=user)
  20. return Response(serializer.data, status=status.HTTP_200_OK)
  21. return Response("查询的数据不存在", status=status.HTTP_204_NO_CONTENT)
  22. #############
  23. urls.py
  24. from django.urls import path
  25. from . import views
  26. urlpatterns = [
  27. path('info/<int:pk>', views.UserDetailView.as_view(), name="infoDetail")
  28. ]

(二)、更新单条数据

  • 通过id或者pk获取该数据对象
  • 创建序列化器对象,参数是instance和data两个
  • 数据校验:序列化器对象.is_valid(raise_exception=True)
  • 数据更新:序列化器对象.save(),这里不需要重写update()
  • 返回数据 ```python from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .models import UserProfile from .serializers import UserProfileSerializers

class UserDetailView(APIView): “”” 详情视图 “””

  1. def put(self, request, pk):
  2. user = UserProfile.objects.get(pk=pk)
  3. serializer = UserProfileSerializers(data=request.data, instance=user)
  4. serializer.is_valid(raise_exception=True)
  5. serializer.save()
  6. return Response(serializer.data, status=status.HTTP_201_CREATED)
#

urls.py from django.urls import path from . import views

urlpatterns = [ path(‘info/‘, views.UserDetailView.as_view(), name=”infoDetail”) ]

  1. <a name="YFswB"></a>
  2. #### (三)、删除某一条数据
  3. - 通过数据对象调用delete()方法
  4. - 返回结果
  5. ```python
  6. from rest_framework.views import APIView
  7. from rest_framework.response import Response
  8. from rest_framework import status
  9. from .models import UserProfile
  10. from .serializers import UserProfileSerializers
  11. class UserDetailView(APIView):
  12. """ 详情视图 """
  13. def delete(self, request, pk):
  14. UserProfile.objects.get(pk=pk).delete()
  15. return Response(status=status.HTTP_204_NO_CONTENT)
  16. #############
  17. urls.py
  18. from django.urls import path
  19. from . import views
  20. urlpatterns = [
  21. path('info/<int:pk>', views.UserDetailView.as_view(), name="infoDetail")
  22. ]