zoukankan      html  css  js  c++  java
  • drf视图组件、认证组件

    视图组件

    1.基本视图

    url(r'^publish/$', views.PublishView.as_view()),
    url(r'^publish/(?P<pk>d+)/$', views.PublishDetailView.as_view()),
    class PublishSerializers(serializers.ModelSerializer):
        class Meta:
            model=models.Publish
            fields='__all__'
    
    class PublishView(APIView):
    
        def get(self, request):
            publish_list = models.Publish.objects.all()
            bs = PublishSerializers(publish_list, many=True)
            # 序列化数据
    
            return Response(bs.data)
    
        def post(self, request):
            # 添加一条数据
            print(request.data)
    
            bs=PublishSerializers(data=request.data)
            if bs.is_valid():
                bs.save()  # 生成记录
                return Response(bs.data)
            else:
    
                return Response(bs.errors)
    
    class PublishDetailView(APIView):
        def get(self,request,pk):
            publish_obj=models.Publish.objects.filter(pk=pk).first()
            bs=PublishSerializers(publish_obj,many=False)
            return Response(bs.data)
        def put(self,request,pk):
            publish_obj = models.Publish.objects.filter(pk=pk).first()
    
            bs=PublishSerializers(data=request.data,instance=publish_obj)
            if bs.is_valid():
                bs.save() # update
                return Response(bs.data)
            else:
                return Response(bs.errors)
        def delete(self,request,pk):
            models.Publish.objects.filter(pk=pk).delete()
    
            return Response("")
    视图层

    2.mixin类和generice类编写视图

    from rest_framework.mixins import CreateModelMixin,RetrieveModelMixin,ListModelMixin,UpdateModelMixin,DestroyModelMixin
    from rest_framework.generics import GenericAPIView
    # 注:使用mixin类时要继承GenericAPIView类
    class PublishView(ListModelMixin,CreateModelMixin,GenericAPIView): queryset=models.Publish.objects.all() serializer_class=PublishSerializers def get(self, request): return self.list(request) def post(self, request): return self.create(request) class PublishDetailView(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView): queryset=models.Publish.objects.all() serializer_class=PublishSerializers def get(self,request,*args,**kwargs): return self.retrieve(request,*args,**kwargs) def put(self,request,*args,**kwargs): return self.update(request,*args,**kwargs) def delete(self,request,*args,**kwargs): return self.destroy(request,*args,**kwargs)

    3.使用generics 下ListCreateAPIView,RetrieveUpdateDestroyAPIView

    from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView
    class PublishView(ListCreateAPIView):
        queryset=models.Publish.objects.all()
        serializer_class=PublishSerializers
    
    class PublishDetailView(RetrieveUpdateDestroyAPIView):
        queryset=models.Publish.objects.all()
        serializer_class=PublishSerializers

    4.使用ModelViewSet

    路由层:

    url(r'^publish/$', views.PublishView.as_view({'get':'list','post':'create'})),
    url(r'^publish/(?P<pk>d+)/$', views.PublishView.as_view({'get':'retrieve','put':'update','delete':'destroy'})),

    视图层:

    from rest_framework.viewsets import ModelViewSet
    class PublishView(ModelViewSet):
        queryset=models.Publish.objects.all()
        serializer_class=PublishSerializers

    5.ViewSetMixin的使用

    #ViewSetMixin重写了as_view方法
    
    from rest_framework.viewsets import ViewSetMixin
        class Publish(ViewSetMixin,APIView):
            def aa(self,request):
            return HttpResponse('aa')    

    路由层:

    url(r'^test', views.Publish.as_view({'get':'aa'}))

    认证组件

    1.什么是认证?

    校验是否是登录用户。只有认证通过的用户才能访问指定的url地址,比如:查询所有图书信息,需要登录之后才能查看,没有登录,就不能查看,这时就需要用到认证组件。

    2.drf中是如何实现认证的(源码分析)?

    #首先是执行APIView中的dispatch方法
    --->执行self.initial(request, *args, **kwargs)
    --->self.perform_authentication(request)
    --->APIView的perform_authentication(request)
    --->request.user(request是新的request)
    --->去Request类中找user,执行--->self._authenticate()(self是新的reqeust对象)---->Request类的_authenticate(self)方法

    3.使用认证功能

    1.写一个类,MyAuthetication

    2.写两个方法,一个是authenticate,一个是authenticate_header(继承BaseAuthentication类后,可以不用写)

    3.在authenticate方法中写认证逻辑,认证通过,返回空,认证不通过,抛异常

    class MyAuthetication(BaseAuthentication):
        def authenticate(self,request):
            token=request.GET.get('token')
                            
        ret=models.UserToken.objects.filter(token=token).first()
        if ret:
            return None
        else:
            raise AuthenticationFailed('您没有通过认证')
        def authenticate_header(self,request):
          pass    

    4.在要认证的视图类中:

    class BooksView(APIView):
        authentication_classes = [MyAuthentication, ]
    
        def get(self, request):
            book_list = models.Book.objects.all()
            book_ser = BookSerialzers(instance=book_list, many=True)
            return Response(book_ser.data)

     总结:局部使用,只需要在视图类中加入:

    authentication_classes = [MyAuthentication, ]

    4.全局使用

    在settings.py文件中配置:

    REST_FRAMEWORK={
        "DEFAULT_AUTHENTICATION_CLASSES":["app01.my_auth.MyAuthentication",]
    }

    局部禁用:

    在视图类中加入:

    authentication_classes = []

    认证类使用顺序:先用视图类中的验证类,再用settings里配置的验证类,最后用默认的验证类

  • 相关阅读:
    Security headers quick reference Learn more about headers that can keep your site safe and quickly look up the most important details.
    Missing dollar riddle
    Where Did the Other Dollar Go, Jeff?
    proteus 与 keil 联调
    cisco router nat
    router dhcp and dns listen
    配置802.1x在交换机的端口验证设置
    ASAv931安装&初始化及ASDM管理
    S5700与Cisco ACS做802.1x认证
    playwright
  • 原文地址:https://www.cnblogs.com/wangke0917/p/10609694.html
Copyright © 2011-2022 走看看