两个基本类视图APIView,GenericAPIView
APIView继承了Django中的view
权限指将来如果有注册用户的时候,是否有权限访问到我们的视图
认证是当发过来一个用户名和密码的时候,认证一下是否是我的注册用户
限流限制这个ip访问我服务的次数,主要用在反爬上。
GenericAPIView 继承了APIView,
分页功能
过滤排序
指定查询集(查询集有两个特点,惰性查询和缓存)
APIView的使用:
如果使用了rest_framework下面的视图,那么request和response对象就变了。
Request
post表单提交,data = request.data,查询的request.query_params
Rest framework传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework 提供的扩展HttpRequest类的对象。REST framework提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单)将请求数据进行parse解析,解析为类字典对象保存到Request对象中。
常用属性
1、.data
request.data返回解析之后的请求体数据,接收前端的数据
2、.query_params
request.query_params跟Django标准的request.GET相同。查询
Response
返回统一用Response就可以了。
代码如下,新建apiview_view.py
from django.shortcuts import render
from testdjango.models import BookInfo
from book_drf.serializer import BookSerializer
from rest_framework.views import APIView
from rest_framework.request import Request
from rest_framework.response import Response
class Books(APIView):
def get(self, request):
# 查询的时候
print(request.query_params)
books = BookInfo.objects.all()
# 多个对象返回的时候需要加上many=True
ser = BookSerializer(books, many=True)
return Response(ser.data)
def post(self, request):
# 1、获取请求数据
# 2、验证请求数据
# 3、保存数据
# 4、返回结果
# data = request.body.decode() #“{}”
# data_dict = json.loads(data) # 转换成字典 {}
# 使用rest_framework下面的view,request和response就发生了变化.post表单提交
data = request.data
ser = BookSerializer(data=data)
ser.is_valid() # 验证方法,一旦调用这个is_valid()方法,就会调用序列化器里的数据内容是否符合要求,想看下验证结果
# raise_exception=True 的含义是,一旦检出出错误,自动return,不用我们手写return
# print(ser.validated_data) # validated_data 查看验证后的数据
# return JsonResponse(ser.errors)
# 视图通过save() 来调用serialzer序列化器里的crate()方法
ser.save()
# 这个ser.data 是序列化器里的create方法返回的对象,是这个对象里的data
return Response(ser.data)
class Book(APIView):
def get(self, request, pk):
book = BookInfo.objects.get(id=pk)
ser = BookSerializer(book)
return Response(ser.data)
class BookDRFView(APIView):
def put(self, request, pk):
# 同保存一样的逻辑,前端数据都传给后端,只是在保存数据的时候,改为更新数据
# 1、获取请求数据
# 2、验证请求数据
# 3、更新数据
# 4、返回结果
# data = request.body.decode()
# data_dict = json.loads(data)
data = request.data
# 查询id的信息
try:
book = BookInfo.objects.get(id=pk)
except:
return Response({'error': '错误信息'}, status=400)
# 更新的时候需要多传递一个对象,也就是将要更新的对象,和接收的对象都传递到序列化器中
ser = BookSerializer(book, data)
# 验证
ser.is_valid()
# 保存
ser.save()
# 4、返回数据
return Response(ser.data)
在修改完视图方法后,还有修改路由
from django.conf.urls import url
from book_drf import views, apiview_view
urlpatterns = [
url(r'^book_drf/$', apiview_view.Books.as_view()),
url(r'^book_drf/(?P<pk>\d+)/$', apiview_view.Book.as_view()),
url(r'^books_drf/(?P<pk>\d+)/$', apiview_view.BookDRFView.as_view()),
]
只是在接受数据和返回数据处做了变动,其余逻辑没有变。
GenericAPIView 的使用:
1、首先指定查询集
books = self.get_queryset() #获取查询集中的所有数据
2、指定当前类视图使用的序列化器
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
查询所有数据对象
books = self.get_queryset()
查询单一数据对象的使用方式
book = self.get_object()
获取序列化器
ser = self.get_serializer(books, many=True)?
self.get_serializer(data=data)
代码如下:
from django.shortcuts import render
from testdjango.models import BookInfo
from book_drf.serializer import BookSerializer
from rest_framework.generics import GenericAPIView
from rest_framework.request import Request
from rest_framework.response import Response
class Books(GenericAPIView):
queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
def get(self, request):
# 查询的时候
books = self.get_queryset() #获取查询集中的所有数据
# 多个对象返回的时候需要加上many=True
ser = self.get_serializer(books, many=True) # 指定序列化器,获取序列化器对象
return Response(ser.data)
def post(self, request):
# 1、获取请求数据
# 2、验证请求数据
# 3、保存数据
# 4、返回结果
# data = request.body.decode() #“{}”
# data_dict = json.loads(data) # 转换成字典 {}
# 使用rest_framework下面的view,request和response就发生了变化.post表单提交
data = request.data
ser = self.get_serializer(data=data) # 此处也是用self 获取get_serializer,指定序列化器,获取序列化器对象
ser.is_valid() # 验证方法,一旦调用这个is_valid()方法,就会调用序列化器里的数据内容是否符合要求,想看下验证结果
# raise_exception=True 的含义是,一旦检出出错误,自动return,不用我们手写return
# print(ser.validated_data) # validated_data 查看验证后的数据
# return JsonResponse(ser.errors)
# 视图通过save() 来调用serialzer序列化器里的crate()方法
ser.save()
# 这个ser.data 是序列化器里的create方法返回的对象,是这个对象里的data
return Response(ser.data)
class Book(GenericAPIView):
queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
def get(self, request, pk):
book = self.get_object()
ser = self.get_serializer(data=book)
return Response(ser.data)
class BookDRFView(GenericAPIView):
queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
def put(self, request, pk):
# 同保存一样的逻辑,前端数据都传给后端,只是在保存数据的时候,改为更新数据
# 1、获取请求数据
# 2、验证请求数据
# 3、更新数据
# 4、返回结果
# data = request.body.decode()
# data_dict = json.loads(data)
data = request.data
# 查询id的信息
try:
book = self.get_object() #从查询集中获取指定的单个数据对象,前端传递过来一个pk值,这个pk值从查询集里查询出来单个的对象
except:
return Response({'error': '错误信息'}, status=400)
# 更新的时候需要多传递一个对象,也就是将要更新的对象,和接收的对象都传递到序列化器中
ser = self.get_serializer(book, data=data)
# 验证
ser.is_valid()
# 保存
ser.save()
# 4、返回数据
return Response(ser.data)
GenericAPIView与APIView相比来看,没有减少代码量,但是与拓展类一起使用,就可以简化代码
|