drf视图认证组件

序列化组件:

Serializer:

  source:可以是字段方法,深度

  SerializerMethodField 一定配合一个方法使用

ModelSerializer:

  class Meta:

    model = models.Publish

    fields='__all__'

反序列化局部钩子函数源码:

is_valid-->self.run_validation--(执行Serializer的run_validation)--->self.to_internal_value(data)---(执行Serializer的run_validation)

many=True时和many=False时,生成的其实并不是一个对象

  序列化组件先调用__new__方法,如果many=True,生成ListSerializer对象,如果为False,生成Serializer对象

序列化组件source源码部分

  序列化对象.data方法--调用父类data方法--调用对象自己的to_representation(自定义的序列化类无此方法,父类中有)

  Aerializer类里有to_representation方法,for循环执行attribute=field.get_attribute(instance)再去Field类里去找get_attribute方法,self.source_attrs就是被切分的source,然后执行get_attribute方法,source_attrs当参数传递过去,判断是方法就加括号执行,是属性就把值取出来

使用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

正向代理:是一个位于客户端与目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端.

正向代理的用途:突破访问限制,提高访问速度,隐藏用户真实ip

反向代理:是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器.

反向代理的用途:因此服务器真实IP,负载均衡,提高访问速度,提高安全保障

正向代理主要是用来解决访问限制问题,而反向代理则是提供负载均衡,安全防护等作用,二者均能提高访问速度.

__str__和__repr__这两个方法都适用于显示的

__str__直接输出对象时并没有按照__Str__中的格式输出,而使用print输出信息才改变

__repr__无论使用print或者直接输出对象,输出结果都是按照__repr__方法中规定的格式显示

认证组件使用:

创建类:MyAuthentication

类中构建两个方法authenticate和authencate_header

在authencate方法中书写认证逻辑,通过返回空,不通过抛出异常

class MyAuthentication():

  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,n):

    pass

如果需要某个视图类需要验证后才能使用,只需要在视图类加入:

authentication_classes=[MyAuthentication]

 1 一自己编写视图
 2 路由:
 3 url(r'^publish/$',views.PublishView.as_view()),
 4 url(r'^publish/(?P<pk>d+)/$',views.PublishDetailView.as_view())
 5 视图:
 6 class PublishSerializer(serializers.ModelSerializer):
 7     class Meta:
 8         model=models.Puclish
 9         fileds='__all__'
10     #此处可加局部钩子全局钩子进行数据校验
11 class PublishView(APIView):
12     def get(self,request):
13         publish_list=Publish.objects.all()
14         bs=PublishSerializers(publish_list,many=True)
15         return Response(bs.data)
16     def post(self,request):
17         bs=PublishSerializers(data=request.data)
18         if bs.is_valid():
19             bs.save()
20             return Response(bs.data)
21         else:
22             return Response(bs.errors)
23 class PublishDetailView(APIView):
24     def get(self,request,pk):
25         publish=Publish.objects.filter(pk=pk).forst()
26         bs=PublishSerializers(publish,many=False)
27         return Response(bs.data)
28     def put(self,request,pk):
29         publish=Publish.objects.filter(pk=pk).first()
30         bs=PublishSerializers(instance=publish,data=request.data)
31         if bs.is_valid():
32             bs.save()
33             return Response(bs.data)
34         else:
35             return Response(bs.errors)
36       def delete(self,request,pk):
37             Publish.objects.filter(pk=pk).delete()
38             return Response('')
39 二minxin类和generice类编写视图
40 from rest_framework.mixins import CreateModelMixin,ListModelMixin,UpdateModelMixin,DestroyModelMixin,RetriveModelMixin
41 from rest_framework.generics import GenericAPIView
42 class PublishView(ListModelMixin,CreateModelMixin,GenericAPIView):
43     queryset=Publish.objects.all()
44     serializer_class=PublishSerializers
45     def get(self,request):
46         return self.list(request)
47     def post(self,request):
48         return self.create(request)
49 class PublishDetailView(RetriveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView):
50     queryset=Publish.objects.all()
51     serializer_class=PublishSerializers
52     def get(self,request,*args,**kwargs):
53         return self.retrive(request,*args,**kwargs)
54     def put(self,request,*args,**kwargs):
55         return self.update(request,*args,**kwargs)
56     def delete(self,request,*args,**kwargs):
57         return self.destroy(request,&args,**kwargs)
58 三:使用generics下ListCreateAPIView,RetrieveUpdateDestropAPIView
59 from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView
60 class PublishView(ListCreateAPIView):
61     queryset=Publish.objects.all()
62     serializer_class=PublishSerializers
63 四使用ModelViewSet
64 路由:
65 url(r'^publish/$',PublishView.as_view({'get':'list','post':'create'})),
66 url(r'^publish/(?P<pk>d+)/$',PublishView.as_view({'get':'retrieve','put':'update','delete':'destroy'})),
67 视图:
68 from rest_framework.viewsets import ModelViewSet
69 class PublishView(ModelViewSet):
70     queryset=Publish.objects.all()
71     serializer_class=PublishSerializers
视图组件代码
原文地址:https://www.cnblogs.com/suncunxu/p/10608889.html