• CBV FBV rest framework


    CBV与FBV
    
    restful协议
    
         ----  一切皆是资源,操作只是请求方式
         
         ----book表增删改查
             /books/                 books
             /books/add/             addbook
             /books/(d+)/change/    changebook
             /books/(d+)/delete/    delbook
             
        ----book表增删改查
             /books/     -----get            books      -----  返回当前所有数据
             /books/     -----post           books      -----  返回提交数据 
             
             /books/(d+)-----get            bookdetail -----  返回当前查看的单条数据 
             /books/(d+)-----put            bookdetail -----  返回更新数据 
             /books/(d+)-----delete         bookdetail -----  返回空
             
                  
             class  Books(View):
                  def get(self,request):
                      pass  # 查看所有书籍
                      
                  def post(self,request):
                      pass  # 添加书籍
                      
                      
             class  BooksDetail(View):
                  def get(self,request,id):
                      pass  # 查看具体书籍
             
                  def put(self,request,id):
                      pass  # 更新某本书籍
                      
                  def delete(self,request,id):
                      pass  # 删除某本书籍      
             
             
             
                      
    
    
    
    restframework(Django)  
    
        ----针对数据:json
        
        
        (1)Django的原生request:
    
              浏览器   -------------  服务器
              
              "GET url?a=1&b=2 http/1.1
    user_agent:Google
    contentType:urlencoded
    
    "
              "POST url http/1.1
    user_agent:Google
    contentType:urlencoded
    
    a=1&b=2"
    
              request.body: a=1&b=2
              request.POST:
                           if contentType:urlencoded:
                                 a=1&b=2----->{"a":1,"b":2}
        
        (2)restframework 下的APIView:
        
            
        
        
        (3)
        class PublishSerializers(serializers.Serializer):
                name=serializers.CharField()
                email=serializers.CharField()
                
                
            PublishSerializers(queryset,many=true)
            PublishSerializers(model_obj)
            
            
            
        总结:
            1 reuqest类----源码
            
            2 restframework 下的APIView--源码
            
              url(r'^books/$', views.BookView.as_view(),name="books")#  View下的view
    
              books/一旦被访问: view(request) ------APIView: dispatch()
            
            3 def dispatch():
            
                  构建request对象
                  self.request=Request(request)
                  self.request._request
                  self.request.GET  # get
                  self.request.data # POST  PUT
              
                  分发----if get请求:
                        if request.method.lower() in self.http_method_names:
                            handler = getattr(self, request.method.lower(),
                                             self.http_method_not_allowed)
                        else:
                            handler = self.http_method_not_allowed   
    
                        response = handler(request, *args, **kwargs) # self.get(request, *args, **kwargs)
                        
                        return response                
                
            4 序列化类
                # from django.core import serializers
                # ret=serializers.serialize("json",publish_list)
            
                restframework下的序列类  BookModelSerializers
                    将queryset或者model对象序列成一json数据
                        bs=BookModelSerializers(book_list,many=True,context={'request': request})
                        bs=BookModelSerializers(book,context={'request': request})
               
                    还可以做校验数据,json-------》queryset/model-->记录
                    
                        bs=BookModelSerializers(data=request.data)
                        if bs.is_valid():
                            print(bs.validated_data)
                            bs.save() # 重写create方法
            5 操作数据:
            
                以Book表为例
                    class BookView(APIView):
                        # 查看所有书籍
                        def get(self,request):
                            book_list=Book.objects.all()
                            bs=BookModelSerializers(book_list,many=True,context={'request': request})
                            return Response(bs.data)
                            
                        # 添加一本书籍    
                        def post(self,request):
                            # post请求的数据
                            bs=BookModelSerializers(data=request.data)
                            if bs.is_valid():
                                print(bs.validated_data)
                                bs.save()# create方法
                                return Response(bs.data)
                            else:
                                return Response(bs.errors)
    
                    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()
    1 CBV
    
    2 APIView
     class BookView(APIView):pass
     url(r'^books/$', views.BookView.as_view(),name="books"),
     url(r'^books/$', View类下的view,name="books"),
     一旦访问books/:  view(request)======APIView类下的dispatch()====请求方式对应的示例方法()
    
    3 def dispatch():
          #一 初始化操作
          # (1) 构建新的request:
          self.request=self.initial_request()
          # self.request._request
          # self.request.GET
          # self.request.data
          # (2) 执行组件
          # 认证,权限,频率
          # 认证:request.user
          self.initial(request, *args, **kwargs)
                     ====   # 认证组件
                            self.perform_authentication(request)
                               ==== request.user
                                         ===== 
                                              for authenticator in self.authenticators:  # [TokenAuth(),]
                                                        try:
                                                            user_auth_tuple = authenticator.authenticate(self)
                                                        except exceptions.APIException:
                                                            self._not_authenticated()
                                                            raise
    
                                                        if user_auth_tuple is not None:
                                                            self._authenticator = authenticator
                                                            self.user, self.auth = user_auth_tuple
                                                            return
                            
                            
                            # 权限组件
                            self.check_permissions(request)
                               ===========
                                     for permission in self.get_permissions():
                                            if not permission.has_permission(request, self):
                                                self.permission_denied(
                                                    request, message=getattr(permission, 'message', None)
                                                )
                            
                            
                            # 频率组件
                            self.check_throttles(request)
                            
                              =============
                                for throttle in self.get_throttles():  # [VisitRateThrottle(),]
                                        if not throttle.allow_request(request, self):
                                            self.throttled(request, throttle.wait()) # 受限制
                           
                            
           # 分发
                if request.method.lower() in self.http_method_names:
                    handler = getattr(self,request.method.lower(),
                                      self.http_method_not_allowed)
            
                response = handler(request, *args, **kwargs)
                
                return response
    
                
    4 序列化组件
        
        class PublishSerializers(serializers.Serializer):
                name = serializers.CharField()
                email = serializers.CharField()
                        
        class PublishModelSerializers(serializers.ModelSerializer):
                class Meta:
                    model=Publish
                    fields="__all__"
        
        # queryset或者model对象-------------》json数据
        ps=PublishSerializers(queryset,many=True)
        ps.data # [{},{},{}]
        
        ps=PublishSerializers(model_obj,many=False)
        ps.data # {}
        
        
        # json数据-------》记录
        # 添加操作
        ps=PublishSerializers(data=request.data)
        if ps.is_valid():
           ps.save()  # create
           
        # 更新操作
        
        ps=PublishSerializers(model_obj,data=request.data)
        if ps.is_valid():
           ps.save()  # update
        
            
    5 视图组件
        # 版本1:
              # Book表
                class BookView(APIView):
                    
                    def get(self,request):
                        book_list=Book.objects.all()
                        bs=BookModelSerializers(book_list,many=True,context={'request': request})
                        return Response(bs.data)        
                    def post(self,request):
                        # post请求的数据
                        bs=BookModelSerializers(data=request.data)
                        if bs.is_valid():
                            print(bs.validated_data)
                            bs.save()# create方法
                            return Response(bs.data)
                        else:
                            return Response(bs.errors)
    
    
                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()
        
    
        # 版本2:mixIn
        
            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)
                
                
        # 版本3:基于通用类
            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
                
        # 版本4
         class AuthorModelView(viewsets.ModelViewSet):
                queryset = Author.objects.all()
                serializer_class = AuthorModelSerializers
                
         url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
         url(r'^authors/(?P<pk>d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put"
        
         流程:
             url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
             url(r'^authors/$', ViewSetMixin.as_view({"get":"list","post":"create"}),name="author"),
             url(r'^authors/$', ViewSetMixin类下的view),
             一旦访问 /authors/:
                  ViewSetMixin
                 def  view():
                    for method, action in actions.items(): # {"get":"list","post":"create"}
                        handler = getattr(self, action)    # self.list  self.create
                        setattr(self, method, handler)            
                             
                    self.dispatch(request, *args, **kwargs)
                
                APIView类下的self.dispatch
                      # 分发
                        if request.method.lower() in self.http_method_names:
                            handler = getattr(self,request.method.lower(),
                                              self.http_method_not_allowed)
                    
    
                        response = handler(request, *args, **kwargs) # self.list()
                        
                        return response
            
        
    6 认证权限频率 组件      
          
        request.META:
            {'ALLUSERSPROFILE': 'C:\ProgramData', 
            'APPDATA': 'C:\Users\Administrator\AppData\Roaming', 
            'COMMONPROGRAMFILES': 'C:\Program Files\Common Files', 
            'COMMONPROGRAMFILES(X86)': 'C:\Program Files (x86)\Common Files',
            'COMMONPROGRAMW6432': 'C:\Program Files\Common Files', 
            'COMPUTERNAME': 'PC201712041709',
            'COMSPEC': 'C:\Windows\system32\cmd.exe', 
            'DJANGO_SETTINGS_MODULE': 'restdemo.settings', 
            'FP_NO_HOST_CHECK': 'NO', 'HOMEDRIVE': 'C:', 
            'HOMEPATH': '\Users\Administrator',
            'LOCALAPPDATA': 'C:\Users\Administrator\AppData\Local', 
            'LOGONSERVER': '\\PC201712041709', 
            'NUMBER_OF_PROCESSORS': '4', 'OS': 'Windows_NT',
            'PATH': 'C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Users\Administrator\AppData\Local\Programs\Python\Python36;C:\Users\Administrator\AppData\Local\Programs\Python\Python36\Scripts;C:\Python27;E:\MySQL Server 5.6\bin;C:\Users\Administrator\AppData\Local\Programs\Python\Python36\Scripts\;C:\Users\Administrator\AppData\Local\Programs\Python\Python36\;C:\Users\Administrator\AppData\Local\atom\bin', 
            'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 
            'PROCESSOR_ARCHITECTURE': 'AMD64', 
            'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 60 Stepping 3, GenuineIntel',
            'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '3c03', 
            'PROGRAMDATA': 'C:\ProgramData',
            'PROGRAMFILES': 'C:\Program Files',
            'PROGRAMFILES(X86)': 'C:\Program Files (x86)', 
            'PROGRAMW6432': 'C:\Program Files', 
            'PSMODULEPATH': 'C:\Windows\system32\WindowsPowerShell\v1.0\Modules\', 
            'PUBLIC': 'C:\Users\Public', 'PYCHARM_HOSTED': '1', 'PYTHONIOENCODING': 'UTF-8', 
            'PYTHONPATH': 'C:\Users\Administrator\PycharmProjects\s9\restdemo', 'PYTHONUNBUFFERED': '1', 
            'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\Windows', 
            'TEMP': 'C:\Users\ADMINI~1\AppData\Local\Temp', 'TMP': 'C:\Users\ADMINI~1\AppData\Local\Temp',
            'USERDOMAIN': 'PC201712041709', 
            'USERNAME': 'Administrator', 
            'USERPROFILE': 'C:\Users\Administrator', 
            'WINDIR': 'C:\Windows', 'WINDOWS_TRACING_FLAGS': '3', 
            'WINDOWS_TRACING_LOGFILE': 'C:\BVTBin\Tests\installpackage\csilogfile.log',
            'RUN_MAIN': 'true', 'SERVER_NAME': 'PC201712041709', 
            'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '8000', 
            'REMOTE_HOST': '', 
            'CONTENT_LENGTH': '', 
            'SCRIPT_NAME': '', 
            'SERVER_PROTOCOL': 'HTTP/1.1', 
            'SERVER_SOFTWARE': 'WSGIServer/0.2', 
            'REQUEST_METHOD': 'GET', 
            'PATH_INFO': '/authors/', 
            'QUERY_STRING': 'token=8204b8e3ac40bf59ae480d17c146b51a', 
            'REMOTE_ADDR': '127.0.0.1', 
            'CONTENT_TYPE': 'text/plain', 
            'HTTP_HOST': '127.0.0.1:8000', 
            'HTTP_CONNECTION': 'keep-alive', 
            'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36', 
            'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 
            'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9', 'HTTP_COOKIE': 'csrftoken=jtus3l4GJEc9TFXWYCWxkBIZprcOv7C1vFMIyOHs7Zkxt015FwVZ2KEEeDV6LOyN', 'wsgi.input': <_io.BufferedReader name=832>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>, 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>}
        
    
    7 解析器-----数据解析器
        from rest_framework.parsers import JSONParser,FormParser,MultiPartParser,FileUploadParser
        parser_classes = [JSONParser,FormParser]
        
    8 路由控制
        针对:
             url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
             url(r'^authors/(?P<pk>d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailauthor"),
    
           
             class AuthorModelView(viewsets.ModelViewSet):
       
                    queryset = Author.objects.all()
                    serializer_class = AuthorModelSerializers
                    
                    
                    
             url(r'^books/$', views.BookModelView.as_view({"get":"list","post":"create"}),name="author"),
             url(r'^books/(?P<pk>d+)/$', views.BookModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailbook"),
             
             
           
             class AuthorModelView(viewsets.ModelViewSet):
       
                    queryset = Author.objects.all()
                    serializer_class = AuthorModelSerializers
         
         
    9 分页 
    
        
    
    10 响应器  Response
  • 相关阅读:
    Unix Vi 命令详解
    硬盘安装 solaris
    Oracle 10g RAC OCR 和 VotingDisk 的备份与恢复
    Unix vmstat 命令
    Unix Vi 命令详解
    How do I rename a data file
    Oracle 购买价格 和 服务费 计算方式
    Solaris 更改系统语言
    硬盘安装 solaris
    How do I rename a data file
  • 原文地址:https://www.cnblogs.com/shangchunhong/p/9426777.html
Copyright © 2020-2023  润新知