zoukankan      html  css  js  c++  java
  • restful规范和drf模块

    restfu1规范

    它是一个规范,面向资源架构
    10条规范:
        1.api与用户的通信协议,总是使用https协议
        api网上提供的接口
        2.域名:
            尽量将api部署在专用域名(会存在跨域问题)
            API很简单
            
        3.版本
            可以放在路径或请求头中
            
        4.路径,视网络上任何东西都是资源,均使用名词表示
            
        5.method:通过请求方式来表示进行的操作
                GET 获取所有图书
                POST 表示新增一本书
                delete 删除
                put/patch  表示修改一本书
                
         6.过滤,通过再url上传参的形式进行传递搜索条件
            
         7.状态码:
                1开头  服务器正在处理
                2开头  服务器处理成功
                3开头  重定向
                4开头  客户端错误
                5开头  服务器错误
                注意:在返回的数据中携带状态码
                    
         8.错误处理,应该返回错误信息,error当做key
                        
         9.返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范
        GET 返回资源对象的列表
        GET/1 返回单个资源对象
        POST 返回新生成的资源对象
        PUT 返回完整的资源对象
        PATCH 返回完整的资源对象
        DELETE 返回空字典
        
        10.在返回结果中提供链接
        
      总结:必须说出来的,路径都用名词,请求方式不同,表示不同的操作    
    

    基于原生django写resful规范的接口

    jsonreponse 转列表的时候需要将safe设置为false
    
    

    CBV的源码执行流程

    1.from django.views import View
    
    2.定义一个类继承View
    
    3.定义一个get方法,post方法
    1.url当程序启动后,Books.as_view()已经被解析成as_view的view的内存地址
    2.比如来了一个get请求,拿到第二个位置参数内存地址加括号执行view(request,*args,**kwargs)
    3.又执行了dispatch(request,*args,**kwargs)
    4.dispatch方法先去判断请求是否在允许范围内,通过请求方式,反射出要执行的方法,取执行,然后返回
    
    
    
    1.路由层
     url(r'^register/$', views.Register.as_view())
    2.视图层
    class Register(View):
        def get(self,request):
            return render(request,'register.html')
    
        def post(self,request):
            my_form = myform.Myform(request.POST)
    
     #1.Register.as_view()我们定义的Register类是没有as_view方法的,故去父类View中找
     #2.   @classonlymethod
        def as_view(cls, **initkwargs):
            def view(request, *args, **kwargs):
                .....
                return self.dispatch(request, *args, **kwargs)
      		......
            return view #view返回的是内层闭包函数的地址
         #3.当我们运行程序时,Register.as_view()已执行,替换为view的内存地址
         #4.发起register请求时,执行了view()
           def view(request, *args, **kwargs):
                .....
                #view()本质是执行了dispatch()
                return self.dispatch(request, *args, **kwargs)
        #5.执行view()本质是执行了dispatch()
          def dispatch(self, request, *args, **kwargs):
            #request.methode.lower()即get,post...
            #self.http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
            #判断请求是否合法
            if request.method.lower() in self.http_method_names:
                #通过反射获得方法,我们定义在CBV函数中的get or post 方法
                handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
            else:
                #如果没有定义就做异常处理
                handler = self.http_method_not_allowed
            #执行我们定义的get or  post方法,我们定义的get或post方法一定需要有返回结果,http协议,要有响应,负责就报错了
            return handler(request, *args, **kwargs)
       
    #总结:本质上CBV是执行了dispatch方法,
    #我们知道django框架没有提供json数据的封装方法,我们需要自己处理数据,我们使用CBV时,可以重写dispatch方法,在执行dispatch方法前处理json数据,drf框架帮我们封装了处理json的方法
    #这也决定了我们使用drf框架时必须采用CBV形式
    
    
    #补充:
    #django会处理urlencode编码和formdata编码数据
    #urlencode编码
    #formdata编码
    #json编码:request.POST是没有值,只能从body中取出,直接处理
    #-urlencode和formdata编码,request.POST
    
    
    
    
    

    drf框架安装

    在原来django框架的基础上,帮我们多做了一些封装
    安装
    1.py36 -m pip install djangorestframework
    2.其实就是一个app,需要在settings中配置
    3.只要用drf,以后写的都是cbv
    

    drf简单使用

    1.基础drf写的cbv
    2.from rest_framework.views import APIView
    CBV(APIView)
    3.之前需要做数据库迁移
    4.drf提供的功能
    序列化组件,视图组件,解析器,认证组件,权限组件,频率组件,分页器,响应器,url控制器,版本控制
    
    

    APIView的源码执行流程

    1.只要继承了APIView的函数都局部禁用了csrf
    2.比如get请求来了,执行view的as_view方法内部的view闭包函数
    3.view闭包函数中dispatch方法
    4.现在再执行dispatch方法,就是执行APIView的dispatch方法
    
    
    
    
    一.使用django模块时,CBV继承View
    使用drf时,需要继承(APIView),APIView也继承了View,帮我们多封装了功能
    
    二.路由层
     url(r'^register/$', views.Register.as_view())
    三.视图层
    class Register(APIView):
        def get(self,request):
            return render(request,'register.html')
    
        def post(self,request):
            my_form = myform.Myform(request.POST)
    四. #.Register.as_view()我们定义的Register类是没有as_view方法的,故去父类APIView中找
     @classmethod
        def as_view(cls, **initkwargs):
     		....
            #调用了View的 as_view()方法
            view = super(APIView, cls).as_view(**initkwargs)
           	....
            return csrf_exempt(view)#相当于装饰器,csrf_exempt csrf局部禁用
     五.父类的View的as_view()方法
     @classonlymethod
        def as_view(cls, **initkwargs):
            def view(request, *args, **kwargs):
                self = cls(**initkwargs)
                if hasattr(self, 'get') and not hasattr(self, 'head'):
                    self.head = self.get
                self.request = request
                self.args = args
                self.kwargs = kwargs
                #与View的区别  APIView有自己的dispatch方法,故优先调用的是APIView的dispatch方法
                return self.dispatch(request, *args, **kwargs)
            update_wrapper(view, cls.dispatch, assigned=())
            return view
        
    六.	APIView的dispatch方法
     def dispatch(self, request, *args, **kwargs):
       		#通过initialize_request方法将request进行封装,不再是之前的原生request
            request = self.initialize_request(request, *args, **kwargs)
            self.request = request
            self.headers = self.default_response_headers  
            try:
                self.initial(request, *args, **kwargs)
                #与View的view方法一样了,都是执行自定义的get or  post函数
                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)
    
            except Exception as exc:
                response = self.handle_exception(exc)
    
            self.response = self.finalize_response(request, response, *args, **kwargs)
            return self.response
        
      七.APIView的initialize_request方法
    	 def initialize_request(self, request, *args, **kwargs):
            parser_context = self.get_parser_context(request)
            return Request(
                request,
                parsers=self.get_parsers(),
                authenticators=self.get_authenticators(),
                negotiator=self.get_content_negotiator(),
                parser_context=parser_context)
    
    

    补充:

    装饰器其实就是一个函数
    
    
    
  • 相关阅读:
    python学习笔记(二)-字符串方法
    python学习笔记(一)-基础知识
    Charles抓包工具断点修改返回内容
    Charles抓包工具过滤网络请求
    Jmeter通过正则表达式提取器提取响应结果数据
    【PHP】什么时候使用Try Catch(转)
    【tp5.1】七牛云上传图片
    【PHP】统计问卷调查结果的选项票数和百分比
    【tp5.1】composer安装PHPExcel以及导入导出Excel
    【tp5.1】微信公众号授权登录及获取信息录入数据库
  • 原文地址:https://www.cnblogs.com/robert-zhou/p/10593257.html
Copyright © 2011-2022 走看看