一、概述
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): “”” 视图 “””
def get(self, request, *args, **kwargs):print(request.query_params.get('id'))return HttpResponse('成功')
#
urls.py from django.urls import path from . import views
urlpatterns = [ path(‘info’, views.UserView.as_view(), name=”addInfo”), ]
<a name="C3C94"></a>#### (二)、post请求- 可以传递json格式的数据,request.data获取到的数据是字典格式的,例如:{'username': '黎明', 'password': '213415131'}- 也可以通过表单格式传递数据,request.data获取到的是QueryDict,例如:<QueryDict: {'username': ['黎明']}>```pythonfrom rest_framework.views import APIViewfrom django.http import HttpResponseclass UserView(APIView):""" 视图 """def post(self, request, *args, **kwargs):print(request.data)return HttpResponse('成功')#################urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [path('info', views.UserView.as_view(), name="addInfo"),]
三、Response响应
- 继承自rest_framework中的views模块
返回内容格式更加的灵活多样,包括:
文字
from rest_framework.response import Responseclass UserView(APIView):""" 视图 """def post(self, request, *args, **kwargs):print(request.data)return Response("成功")
json数据
from rest_framework.response import Responseclass UserView(APIView):""" 视图 """def post(self, request, *args, **kwargs):print(request.data)return Response({"message": "成功"})
列表数据
from rest_framework.response import Responseclass UserView(APIView):""" 视图 """def post(self, request, *args, **kwargs):print(request.data)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):
print(request.data)return Response([{"message": "成功"}, {"name": "..."}], status=status.HTTP_200_OK)
<a name="bPIv7"></a>### 四、APIView实现列表视图<a name="3wMJ1"></a>#### (一)、从数据库获取所有的数据信息- 模型对象- 序列化器对象,instance和many=True两个参数- 返回数据, 直接使用serializer.data返回数据,不需要额外的进行数据格式的转换,Django中的HttpResponse必须进行数据格式的转换```pythonfrom rest_framework.views import APIViewfrom rest_framework.response import Responsefrom rest_framework import statusfrom .models import UserProfilefrom .serializers import UserProfileSerializersclass UserListView(APIView):""" 列表视图 """def get(self, request, *args, **kwargs):users = UserProfile.objects.all()serializer = UserProfileSerializers(instance=users, many=True)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): “”” 列表视图 “””
def post(self, request, *args, **kwargs):serializer = UserProfileSerializers(data=request.data)serializer.is_valid(raise_exception=True)serializer.save()return Response(serializer.data, status=status.HTTP_201_OK)
<a name="r4ZSz"></a>### 五、APIView实现详情视图<a name="BOlAH"></a>#### (一)、查询单条数据详情信息- 通过id或者pk获取该数据对象- 创建序列化器对象,参数是instance- 返回数据和状态码```pythonfrom rest_framework.views import APIViewfrom rest_framework.response import Responsefrom rest_framework import statusfrom .models import UserProfilefrom .serializers import UserProfileSerializersclass UserDetailView(APIView):""" 详情视图 """def get(self, request, pk):user = UserProfile.objects.get(pk=pk)if user:serializer = UserProfileSerializers(instance=user)return Response(serializer.data, status=status.HTTP_200_OK)return Response("查询的数据不存在", status=status.HTTP_204_NO_CONTENT)#############urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [path('info/<int:pk>', views.UserDetailView.as_view(), name="infoDetail")]
(二)、更新单条数据
- 通过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): “”” 详情视图 “””
def put(self, request, pk):user = UserProfile.objects.get(pk=pk)serializer = UserProfileSerializers(data=request.data, instance=user)serializer.is_valid(raise_exception=True)serializer.save()return Response(serializer.data, status=status.HTTP_201_CREATED)
#
urls.py from django.urls import path from . import views
urlpatterns = [
path(‘info/
<a name="YFswB"></a>#### (三)、删除某一条数据- 通过数据对象调用delete()方法- 返回结果```pythonfrom rest_framework.views import APIViewfrom rest_framework.response import Responsefrom rest_framework import statusfrom .models import UserProfilefrom .serializers import UserProfileSerializersclass UserDetailView(APIView):""" 详情视图 """def delete(self, request, pk):UserProfile.objects.get(pk=pk).delete()return Response(status=status.HTTP_204_NO_CONTENT)#############urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [path('info/<int:pk>', views.UserDetailView.as_view(), name="infoDetail")]
