继:https://blog.csdn.net/ak739105231/article/details/110562811
一、APIView之request
-----------------------------------View获取数据方式:
GET:
request.GET
POST:
request.POST
request.body
-----------------------------------APIView获取数据方式:
GET:
reuqest.query_params
POST:
request.data
1.1 简单示例:1.url中as_view()的用法;2.views中类继承APIView;3.views中类中get\post的示例
---------------------------------------------------------views.py文件中:
from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
#定义类,继承APIView
class BookAPIView(APIView):
def get(self,request):
print(request.query_params)
return HttpResponse(request.query_params["name"])
def post(self,request):
print(request.data)
return HttpResponse(request.data["name"])
----------------------------------------------------------urls.py文件中:
from django.urls import path
from app06 import views
urlpatterns = [
path('books/', views.BookAPIView.as_view()),
]
-------------------------------------------------------------效果描述:
python manage.py runserver 运行project;
1.通过postman工具,使用get方式请求接口:http://127.0.0.1:8088/app06/books/?name=zhangsna&user=lisi
2.通过postman工具,使用post方式请求接口:http://127.0.0.1:8088/app06/books/
结果:两种方式分别调用BookAPIView里面的get、post函数,正确响应;
二、APIView之response
目的:可以使用response响应各种数据和状态(1.可以返回各种类型数据;2.可以配合状态码使用)
要使用rest_framework中的Response,而不是使用django中的http
from rest_framework.response import Response
示例:views.py文件中,简单的使用rest_framework中的Response,加上status状态码
from rest_framework.views import APIView
from rest_framework.response import Response #使用rest_framework中的Response
from rest_framework import status #加上状态码,
#定义类,继承APIView
class BookAPIView(APIView):
def get(self,request):
print(request.query_params)
return Response(request.query_params)
def post(self,request):
print(request.data)
return Response(request.data,status=status.HTTP_404_NOT_FOUND) ##加上状态码
postman发起post请求:根据views.py中类的post函数中的Response的数据响应,状态码:404
三、APIView实现列表视图(获取所有数据、新增一条数据)
目的:可以使用serializers序列化器和APIView对列表视图进行改写
-----------------------------------------------------------views.py-----------------------
from rest_framework.views import APIView
from rest_framework.response import Response #使用rest_framework中的Response
from rest_framework import status #加上状态码,
from app06.models import *
from app06.serializers import *
#2,序列化器和APIView实现列表视图
class BookListView(APIView):
def get(self,request):
books = BookInfo.objects.all()
serializer = BookInfoModelSerializer(instance=books,many=True)#由于books多个对象,所以加上many=True
return Response(serializer.data)
def post(self,request):
dict_data = request.data #APIView获取数据
serializer = BookInfoModelSerializer(data=dict_data) #反序列化data
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 app06 import views
urlpatterns = [
path('books/', views.BookAPIView.as_view()),
path('booklist/', views.BookListView.as_view()),
]
postman发起post请求:根据views.py中类的post函数中的Response的数据响应,入库;
三、APIView实现详情视图(获取一条数据、修改一条数据,删除一条数据)
注意:这里展示了put\delete的写法;put请求在url及请求body中都有参数;获取方式:request.query_params、request.data
-----------------------------------------------------------views.py-----------------------
from rest_framework.views import APIView
from rest_framework.response import Response #使用rest_framework中的Response
from rest_framework import status #加上状态码,
from app06.models import *
from app06.serializers import *
#2,序列化器和APIView实现详情视图
class BookInfoView(APIView):
def get(self,request):
book = BookInfo.objects.get(id=request.query_params["book_id"])
serializer = BookInfoModelSerializer(instance=book)#由于books多个对象,所以加上many=True
return Response(serializer.data,status=status.HTTP_200_OK)
def put(self,request):
data_dict = request.data #APIView获取数据
book = BookInfo.objects.get(id=request.query_params["book_id"])
serializer = BookInfoModelSerializer(instance=book,data=data_dict) #反序列化data
serializer.is_valid(raise_exception=True) #校验
serializer.save() #入库
return Response(serializer.data,status=status.HTTP_200_OK)
def delete(self,request):
BookInfo.objects.get(id=request.query_params["book_id"]).delete()
return Response(status=status.HTTP_200_OK)
-----------------------------------------------------------urls.py-----------------------
from django.urls import path
from app06 import views
urlpatterns = [
path('books/', views.BookAPIView.as_view()),
path('booklist/', views.BookListView.as_view()),
path('bookinfo/', views.BookInfoView.as_view()),
]