python笔记(Django restframework 视图初见序列化,与认证组件)

前期总结

  1. FBV和CBV

    在这里插入图片描述

  2. 请求方式

    在这里插入图片描述
    注释:put请求:更新请求,完全更新
    patch请求:更新请求,部分更新

  3. 一个类和父类邮相同的方法想要调用父类的方法
    在这里插入图片描述

  4. 将model对象转化为字典
    在这里插入图片描述

一、序列化

from app01.serilizer import *
class PublishView(APIView):
    def get(self,request):

        # restframework
        # 取数据
        # print("request.data", request.data)
        # print("request.data type", type(request.data))
        # print(request._request.GET)
        # print(request.GET)
        # 序列化
        # 方式1:
        # publish_list=list(Publish.objects.all().values("name","email"))

        # 方式2:
        # from django.forms.models import model_to_dict
        # publish_list=Publish.objects.all()
        # temp=[]
        # for obj in publish_list:
        #     temp.append(model_to_dict(obj))

        # 方式3:
        # from django.core import serializers
        # ret=serializers.serialize("json",publish_list)

        # 序列组件
        publish_list = Publish.objects.all()
        ps = PublishModelSerializers(publish_list, many=True)
        return Response(ps.data)

在这里插入图片描述

二、restframework使用(初级使用)

  1. 原生使用
    在这里插入图片描述

  2. 引入ModelSerializer

    url

    from django.conf.urls import url
    from django.contrib import admin
    
    
    from app01 import views
    urlpatterns = [
    
        url(r'^admin/', admin.site.urls),
        url(r'^publishes/$', views.PublishView.as_view(),name="publish"), #  View:view(request)=====APIView:dispatch()
        url(r'^publishes/(?P<pk>\d+)/$', views.PublishDetailView.as_view(),name="detailpublish"), #  View:view(request)=====APIView:dispatch()
    
        url(r'^books/$', views.BookView.as_view(),name="books"),
        url(r'^books/(\d+)/$', views.BookDetailView.as_view(),name="detailbook"),
    
    ]
    

    view

    from django.views import View
    from rest_framework.response import Response
    from .models import *
    from rest_framework.views import APIView
    from rest_framework import serializers
    
    class BookModelSerializers(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = "__all__"
    
    class BookDetailView(APIView):
    
        def get(self,request,id):
    
            book=Book.objects.filter(pk=id).first()
            bs=BookModelSerializers(book,context={'request': request})
            return Response(bs.data)
    
        def put(self,request,id):
            book=Book.objects.filter(pk=id).first()
            bs=BookModelSerializers(book,data=request.data)
            if bs.is_valid():
                bs.save()
                return Response(bs.data)
            else:
                return Response(bs.errors)
    
        def delete(self,request,id):
            Book.objects.filter(pk=id).delete()
    
            return Response()
    
    
    class PublishModelSerializers(serializers.ModelSerializer):
        class Meta:
            model=Publish
            fields="__all__"
            
    class PublishDetailView(APIView):
        def get(self, request, pk):
    
            publish = Publish.objects.filter(pk=pk).first()
            ps = PublishModelSerializers(publish)
            return Response(ps.data)
    
        def put(self, request, pk):
            publish = Publish.objects.filter(pk=pk).first()
            ps = PublishModelSerializers(publish, data=request.data)
            if ps.is_valid():
                ps.save()
                return Response(ps.data)
            else:
                return Response(ps.errors)
    
        def delete(self, request, pk):
            Publish.objects.filter(pk=pk).delete()
    
            return Response()
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    class BookModelSerializers(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = "__all__"
    
        #publish=serializers.CharField(source="publish.pk")
        publish=serializers.HyperlinkedIdentityField(
                view_name="detailpublish",
                lookup_field="publish_id",
                lookup_url_kwarg="pk",
    
        )
    

    在这里插入图片描述
    在这里插入图片描述

二、restframework使用(中级使用mixins和generics引入)

urls

	   url(r'^authors/$', views.AuthorModelView.as_view(),name="author"),
	   url(r'^authors/(?P<pk>\d+)/$', views.AuthorModelView.as_view(),name="detailauthor"),

views


		 from rest_framework import mixins
		 from rest_framework import generics
		
		 class AuthorView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):
		     queryset=Author.objects.all()
		     serializer_class =AuthorModelSerializers
		
		     def get(self,request, *args, **kwargs):
		         return self.list(request, *args, **kwargs)
		     def post(self,request, *args, **kwargs):
		         return self.create(request, *args, **kwargs)
		
		
		 class AuthorDetailView(mixins.RetrieveModelMixin,mixins.DestroyModelMixin,mixins.UpdateModelMixin,generics.GenericAPIView):
		     queryset = Author.objects.all()
		     serializer_class = AuthorModelSerializers
		
		     def get(self,request,*args, **kwargs):
		         return self.retrieve(request,*args, **kwargs)
		
		     def delete(self,request,*args, **kwargs):
		         return self.destroy(request,*args, **kwargs)
		
		     def put(self,request,*args, **kwargs):
		         return self.retrieve(request,*args, **kwargs)

三、restframework使用(基于类的视图)

在这里插入图片描述

在这里插入图片描述

 from rest_framework import mixins
 from rest_framework import generics


 class AuthorView(generics.ListCreateAPIView):
     queryset=Author.objects.all()
     serializer_class =AuthorModelSerializers

 class AuthorDetailView(generics.RetrieveUpdateDestroyAPIView):
     queryset = Author.objects.all()
     serializer_class = AuthorModelSerializers

四、认证与权限组件

  1. 自定义权限

    def get_random_str(user):
        import hashlib,time
        ctime=str(time.time())
    
        md5=hashlib.md5(bytes(user,encoding="utf8"))
        md5.update(bytes(ctime,encoding="utf8"))
    
        return md5.hexdigest()
    
    from .models import User
    
    class LoginView(APIView):
    
        def post(self,request):
    
            name=request.data.get("name")
            pwd=request.data.get("pwd")
            user=User.objects.filter(name=name,pwd=pwd).first()
            res = {"state_code": 1000, "msg": None}
            if user:
    
                random_str=get_random_str(user.name)
                token=Token.objects.update_or_create(user=user,defaults={"token":random_str})
                res["token"]=random_str
            else:
                res["state_code"]=1001 #错误状态码
                res["msg"] = "用户名或者密码错误"
    
            import json
            return Response(json.dumps(res,ensure_ascii=False))
    

    在这里插入图片描述

    from rest_framework import exceptions
    
    from rest_framework.authentication import BaseAuthentication
    
    
    from .models import *
    class TokenAuth(BaseAuthentication):
        def authenticate(self,request):
            token = request.GET.get("token")
            token_obj = Token.objects.filter(token=token).first()
            if not token_obj:
                raise exceptions.AuthenticationFailed("验证失败123!")
            else:
                return token_obj.user.name,token_obj.token
    
    
    class AuthorModelView(viewsets.ModelViewSet):
        authentication_classes = [TokenAuth,]
        permission_classes = []
        throttle_classes = []# 限制某个IP每分钟访问次数不能超过20次
        queryset = Author.objects.all()
        serializer_class = AuthorModelSerializers
    
  2. 全局视图认证组件

    源码涉及到的知识

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    	REST_FRAMEWORK = {
    	    "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.TokenAuth",]
    	
    	}  # 认证类的路径
    

    无论什么请求都会走下面这个注册过的认证

    app01/utils/TokenAuth路径

    	from rest_framework import exceptions
    	
    	from rest_framework.authentication import BaseAuthentication
    	
    	
    	from .models import *
    	class TokenAuth(BaseAuthentication):
    	    def authenticate(self,request):
    	        token = request.GET.get("token")
    	        token_obj = Token.objects.filter(token=token).first()
    	        if not token_obj:
    	            raise exceptions.AuthenticationFailed("验证失败123!")
    	        else:
    	            return token_obj.user.name,token_obj.token
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值