rest_framework框架入门(四)

rest_framework框架入门(四)

  • request 类
    • request.data
    • request.query_params
  • response类
  • View 视图使用
    • APIView (一级视图)
    • GenericAPIView (二级视图)
    • mixins类
      • ListModelMixin
      • CreateModelMixin
      • RetrieveModelMixin
      • UpdateModelMixin
      • DestroyModelMixin
      • 混合使用实例:
    • 三级视图
      • CreateAPIView
      • ListAPIView
      • RetireveAPIView
      • DestoryAPIView
      • UpdateAPIView
      • ListCreateAPIView
      • RetrieveUpdateAPIView
      • RetrieveUpdateDestoryAPIView
    • ViewSet的使用

request 类

REST框架的 Request 类扩展了标准 HttpRequest,允许你以与通常处理表单数据相同的方式处理具有JSON数据或其他媒体类型的请求。

request.data

request.data 返回请求主体的以解析的内容。这类似于标准request.POST和request.FILES属性,除了:

  • 它包括所有已解析的内容,包括文件和非文件输入。
  • 它支持解析除HTTP方法之外的其他内容POST,这意味着您可以访问内容PUT和PATCH请求。
  • 它支持REST框架的灵活请求解析,而不仅仅支持表单数据。例如,您可以像处理传入表单数据一样处理传入的JSON数据。

request.query_params

建议使用request.query_params而不是Django的标准request.GET。这样做有助于保持代码库更加正确和明显 - 任何HTTP方法类型都可能包含查询参数,而不仅仅是GET请求。

response类

数据类型可以是 str,list,dict等

class Response(SimpleTemplateResponse):
    """
    An HttpResponse that allows its data to be rendered into
    arbitrary media types.
    """
    
    def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):

参数:

  • data :响应的序列化数据
  • status : 响应的状态码
  • template_name : 模板的名称
  • headers : 响应头信息
  • content_type :响应的内容类型。一般不需要指定,框架根据前端传递的信息来指定。

View 视图使用

最好还是看官方文档:https://www.django-rest-framework.org/api-guide/views/

APIView (一级视图)

APIView 类它是 Django View 类的子类。与使用常规View类几乎相同,像往常一样,传入的请求被分派到适当的处理程序方法,如.get().post()

与Django View的不同地方:

  • 传递给处理程序方法的请求将是REST框架的Request实例,而不是Django的HttpRequest实例。
  • 处理程序方法可以返回REST框架Response,而不是Django HttpResponse。该视图将管理内容协商并在响应上设置正确的渲染器。
  • 任何APIException例外都将被捕获并调解为适当的响应。
  • 将对传入的请求进行身份验证,并在将请求分派给处理程序方法之前运行适当的权限和/或限制检查。

写一个get和post请求实例:

from rest_framework.views import APIView

class ListBooks(APIView):

    def get(self, request):
        # booknames = [book.name for book in Book.objects.all()]
        print('----------------->')
        obj = Book.objects.all()
        ser = BookSerializer(obj,many=True)
        return Response(ser.data)

    def post(self,request):
        print('-------post------>',request.data,type(request.data))
        ser = BookSerializer(data=request.data)
        ser.is_valid()
        ser.save()
        return Response(ser.validated_data)

GenericAPIView (二级视图)

这个类是对APIView 的再次封装,实现更强和更简洁的功能。
提供的每个具体通用视图是通过GenericAPIView与一个或多个mixin类组合而构建的。

GenericAPIView的属性:

  • queryset 属性 : 必须设置此属性,使用这个就不必将模型的对象传给seriliazer,系统会自己检测添加,如果要覆盖视图方法,则调用get_queryset()而不是直接访问此属性。
  • serializer_class 属性 :通过这个,在返回时,不必去指定某个serilizer,也可以使用覆盖该get_serializer_class()方法。
  • lookup_field - 应该用于执行单个模型实例的对象查找的模型字段。默认为’pk’。请注意,使用超链接的API时,您需要确保双方的API意见和串行类设置查找字段,如果你需要使用一个自定义值。
  • pagination_class : 用于控制分页
  • filter_backends : 应该用于过滤查询集的过滤器后端类列表

mixins类

ListModelMixin

提供一种.list(request, *args, **kwargs)实现列出查询集的方法。
如果填充了查询集,则返回200 OK响应。可以对响应数据进行分页。

CreateModelMixin

提供.create(request, *args, **kwargs)实现创建和保存新模型实例的方法。
如果创建了一个对象成功,则返回一个201 响应,如果为创建对象而提供的请求数据无效, 返回400响应。

RetrieveModelMixin

提供一种.retrieve(request, *args, **kwargs)方法,该方法实现在响应中返回现有模型实例。
如果可以检索对象,则返回200 OK响应,并将对象的序列化表示作为响应的主体。否则它会返回一个404 Not Found。

UpdateModelMixin

提供一种.update(request, *args, **kwargs)方法,用于实现更新和保存现有模型实例。
同时也提供partial_update(request, *args, **kwargs)方法,可以实现局部更新。
成功返回200,序列化器校验数据失败时,返回400错误。

DestroyModelMixin

提供.destroy(request, *args, **kwargs)实现删除现有模型实例的方法。
如果删除了一个对象,则返回一个204 响应,否则返回一个404 。

混合使用实例:

from goods.serializers import *
from goods.models import *
from rest_framework.mixins import ListModelMixin
from rest_framework.generics import GenericAPIView
class GenericsView(GenericAPIView, ListModelMixin):
    queryset = GoodsInfo.objects.all()
    serializer_class = GoodsInfoNewSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

三级视图

使用已有的子类代表GenericAPIView和mixins的混合使用

CreateAPIView

提供post方法处理程序
继承自: GenericAPIView、CreateModelMixin

ListAPIView

提供get方法处理程序
继承自:GenericAPIView、ListModelMixin

RetireveAPIView

提供get方法处理程序
继承自: GenericAPIView、RetrieveModelMixin

DestoryAPIView

提供delete方法处理程序
继承自:GenericAPIView、DestoryModelMixin

UpdateAPIView

提供put和patch方法处理程序
继承自:GenericAPIView、UpdateModelMixin

ListCreateAPIView

提供get和post方法处理程序
继承自:GenericAPIView,ListModelMixin,CreateModelMixin

RetrieveUpdateAPIView

提供get,put并且patch方法处理
继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin

RetrieveUpdateDestoryAPIView

提供 get、put、patch、delete方法
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin

ViewSet的使用

使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中
views.py内容:

class MyViewSet(GenericViewSet, ListModelMixin):
    queryset = GoodsInfo.objects.filter(id__gt=15)
    serializer_class = GoodsInfoNewSerializer
    
class GoodsInfoView(ModelViewSet):
    queryset = GoodsInfo.objects.all()
    serializer_class = GoodsInfoNewSerializer
    
class UserViewSet(ViewSet):
	def list(self, request):
	    queryset = User.objects.all()
	    serializer = UserSerializer(queryset, many=True)
	    return Response(serializer.data)
	def retrieve(self, request, pk=None):
	    queryset = User.objects.all()
	    user = get_object_or_404(queryset, pk=pk)
	    serializer = UserSerializer(user)
	    return Response(serializer.data)

urls.py内容:

from django.conf.urls import url, include
from goods.views import *
from rest_framework.routers import DefaultRouter

# 定义视图处理的路由器
router = DefaultRouter()
# 在路由器中注册视图集
router.register('showgoods', GoodsInfoView, base_name='hello')
router.register('viewset', MyViewSet, base_name='viewset')

urlpatterns = [
    url(r'', include(router.urls)),
    url(r'^goodslist/$', ListGoodsView.as_view()),
    url(r'^show/$', GenericsView.as_view()),
    url(r'^(?P\d+)+(/showgoods/)$', GoodsInfoView.as_view({'get':'retrieve','post':'create','put':'update'})),
]

1.ViewSet
继承自APIView,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。

2.GenericViewSet
继承自GenericAPIView,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于列表视图与详情信息视图的开发。

3.ModelViewSet
继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

4.ReadOnlyModelViewSet
继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin。

你可能感兴趣的:(django)