在视图类中,接下来会介绍2个视图基类,5个拓展类视图,9个拓展类视图的子类。
1. 视图基类
1.1 APIViews
1.1.1 继承APIView类的子类
导包:**from rest_framework.views import APIView**
**APIView**
是**REST framework**
提供的所有视图的基类,继承自Django的View类。
APIView与View的不同之处在于:
- 传入到视图方法中的是
**REST framework**
的**Request**
对象,而不是**Django**
的**HttpRequeset**
对象; - 视图方法可以返回
**REST framework**
的**Response**
对象,视图会为响应数据设置(render)符合前端要求的格式; - 任何APIException异常都会被捕获到,并且处理成合适的响应信息;
- 在被派发到处理方法(匹配路由)之前,会对请求进行身份认证、权限检查、流量控制。
支持定义的属性:
- authentication_classes ———列表或元祖,身份认证类;
- permissoin_classes ———列表或元祖,权限检查类;
- throttle_classes ———列表或元祖,流量控制类;
在APIView中仍以常规的类视图定义方法来实现get() 、post() 或者其他请求方式的方法。
from rest_framework.views import APIView
from rest_framework.response import Response
# url(r'^books/$', views.BookListView.as_view()),
class BookListView(APIView):
def get(self, request):
books = BookInfo.objects.all()
serializer = BookInfoSerializer(books, many=True) # many=True----指明序列化器需要翻序列化多个数据
return Response(serializer.data)
def put(self, request, pk):
# 1、获取前端数据
# data = request.body.decode()
# data_dict = json.loads(data)
data=request.data
# 2、验证数据
try:
book = BookInfo.objects.get(id=pk)
except:
return JsonResponse({'error': '错误信息'}, status=400)
ser = BookSerialzier(book, data=data)
# 验证数据合法性
ser.is_valid()
# 3、更新数据
ser.save()
# 4、返回结果
return Response(ser.data)
1.1.2 被@api_view()装饰的视图函数
在REST framework中,你也可以使用常规的基于函数的视图。它提供了一组简单的装饰器,用来包装你的视图函数,以确保视图函数会收到**Request**
(而不是Django一般的HttpRequest)对象,并且返回**Response**
(而不是Django的HttpResponse)对象,同时允许你设置这个请求的处理方式。
@api_view()装饰器函数的参数:
**@api_view(http_method_names=['GET'], exclude_from_schema=False)**
**http_method_names**
:元素可以是**' GET '、' PUT '、' DELETE '、' PATCH '、' UPDATE '**
其中的一个或多个的列表或元组,默认为** ' GET '**
。**exclude_from_schema**
:值为True代表API视图忽视任何自动生成的视图,默认为False。@api_view(['GET', 'POST'],exclude_from_schema=False)
def hello_world(request):
if request.method == 'POST':
return Response({"message": "Got some data!", "data": request.data})
return Response({"message": "Hello, world!"})
除@api_view()装饰器外,DRF还提供了一组可以加到视图上的装饰器来重写默认值,这些装饰器必须放在@pai_view()装饰器后(下)面。
- @renderer_classes(…)
- @parser_classes(…)
- @authentication_classes(…)
- @throttle_classes(…)
- @permission_classes(…)
这些装饰器和上文中的APIView的子类中设置的属性相对应,装饰器中的每一个都接受一个参数,这个参数必须是**类的列表或元组。**
1.2 GenericAPIView
- 包:
**from rest_framework.generics import GenericAPIView**
- GenericAPIView继承自APIVIew,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。
支持定义的属性:
- 列表视图与详情视图通用:
- queryset ——列表视图的查询集
- serializer_class ——- 视图使用的序列化器
- 列表视图使用:
- pagination_class ——分页控制类
- filter_backends ——过滤控制后端
详情页视图使用:
列表视图与详情视图通用:
- get_queryset(self)
返回视图使用的查询集,是列表视图与详情视图获取数据的基础,默认返回queryset
属性,可以重写,例如:def get_queryset(self):
user = self.request.user
return user.accounts.all()
- get_queryset(self)
- get_serializer_class(self)
返回序列化器类,默认返回serializer_class
,可以重写,例如:def get_serializer_class(self):
if self.request.user.is_staff:
return FullAccountSerializer
return BasicAccountSerializer
返回序列化器对象,被其他视图或扩展类使用,如果我们在视图中想要获取序列化器对象,可以直接调用此方法。
注意,在提供序列化器对象的时候,REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。get_serializer(self, args, *kwargs)
- 详情视图使用:
- get_object(self) 返回详情视图所需的模型类数据对象,默认使用
lookup_field
参数来过滤queryset。 在试图中可以调用该方法获取详情信息的模型类对象。
若详情访问的模型类对象不存在,会返回404。
该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。
- get_object(self) 返回详情视图所需的模型类数据对象,默认使用
2. 五个拓展类
2.1 ListModelMixin
列表视图扩展类,提供**list(request, *args, **kwargs)**
方法快速实现列表视图,返回200状态码。