zoukankan      html  css  js  c++  java
  • restful : 面向资源架构

    restful 规范

    1. API与用户的通信协议,https协议
    2. 域名 https://api.example.com  尽量将API部署在专用域名
           https://example.org/api    API简单
    3. 版本
        https://api.example.com/v1/    v1: 版本
        把版本放在请求头中
    4. 路径,网络上任何东西都是资源,均使用名词表示(可复数)
        127.0.0.1/books/  (使用名词books,而不是get_books)
    5. 请求方式method: 通过请求方式来表示相应操作
        127.0.0.1/books/
        get: 获取图书 (服务器取出资源)
        post: 表示新增一本书 (服务器新建一个资源)
        delete: 表示删除一本书 (服务端删除资源)
        put/patch: 表示修改一本书(服务器更新资源)
    6. 过滤,通过url上传参的形式传递搜索条件
    7. 状态码: 
        1开头: 服务器正在处理
        2开头: 服务器处理成功
        3开头: 重定向
        4开头: 客户端错误
        5开头: 服务器错误
        --- 注意: 返回的数据中携带状态码
    8. 错误处理,应返回错误信息,error当做key
    9. 返回结果: 针对不同操作,返回数据格式要求
        GET/collection: 返回资源对象的列表(数组)
        GET/collection/resource: 返回单个资源对象
        POST/collection: 返回新生成的资源
        PUT/collection/resource: 返回完整的资源对象(PATCH一样)
        DELETE /collection/resource: 返回一个空文档
    
    10. 在返回结果中提供链接,Hypermedia API
    
    小结: 路径都用名词表示,请求方式不同表示不同的操作

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

    def books(request):
        if request.method == 'GET':
            LL= [{'id':1,'title':'python'}]
        return JsonResponse(LL,safe=False,json_dumps_params={'ensure_ascii':False})
        
    注意:restful 要求GET 返回资源对象的列表

    CBV 源码执行流程(view 执行流程):

    class Books(View):
        def dispatch(self,request,*args,**kwargs):
        print(1)
        obj = super().dispatch(request,*args,**kwargs)
        print(2)
        return obj
        def get(self,request):
            return
        def post(self,request):
            return 
            
    1. 路由: url(r'^books/', views.Books.as_view()),
    2. 当程序启动,as_view() 已经执行,返回一个函数(view)的内存地址
    3. 当来请求(get,post),view加括号执行, 即内部dispatch方法执行,
    4. dispatch 方法通过判断小写是否在http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] 中,用getattr 将字符串隐射成为 get 或post 或其他的函数内存地址, return的结果就是调用get(),post()...

    drf 框架安装和简单使用

    在原来django框架的基础上(在继承View基础上),多做了一些事
        drf 提供的: 序列化组件 | 视图组件 | 解析器 | 认证组件 | 权限组件 | 频率组件 | 分页器 | 响应器 | url控制器 | 版本控制
        
    安装: pip install djangorestframework
    实质是一个app
    settings中注册 INSTALLED_APPS = 'rest_framework',
    只要用drf, 都是cbv
    
    # 基于drf 写的cbv---继承APIView (唯一区别)
    from rest_framework.views import APIView
    class Books(APIView)
    
    小结:
    基于drf写的cbv:
    首先安装: pip install djangorestframework
    然后注册: 'rest_framework'
    继承: from rest_framework.views import APIView

    drf 之 APIView 和 Response源码分析

    1. 路由: url(r'^books/', views.Books.as_view()),
    2. 继承APIView: class Books(APIView) 
    3. as_view() 走的是APIView 中的as_view 方法, return csrf_exempt(view) 取消局部认证的装饰器
       即: 只要继承了APIView ,就都没有csrf的验证了
    4. 当来请求(get,post), 上步得到的view 函数执行,即内部dispatch方法执行--- 此时的dispatch方法是APIView中的方法
    5. request = self.initialize_request(request, *args, **kwargs)  被包装后的request(里面包含原来的request)
    6. self.initial(request, *args, **kwargs)  该方法中进行了 认证,权限,频率,进行阻拦
    7. 用getattr 将字符串隐射成为 get 或post 或其他的函数内存地址,返回调用的结果
    
    小结:
     class Books(APIView)
         def get(request):
             pass
     1. 一旦继承了APIView, get 方法中的request是处理过后的request
     2. 原来的request, _request = request
     3. request.GET 等价 request._request.GET, 原因如下:
         点拦截属性, setattr and getattr, 如果没有,就会走__getattr__
        新的request 对象 重新写了 __getattr__方法, 把 _request 返回了
     4. request.data  data是post, put 的内容,字典形式
         注意: 以后用 request.data 取出原来在 POST中的内容
     
     
  • 相关阅读:
    VS2005在使用membership的时候,如何连接Access数据库?
    今天想开始写计划的项目,可是就是静不下心来,乱糟糟的!
    今天想开始写计划的项目,可是就是静不下心来,乱糟糟的!
    有钱真好
    网页左边和上面的空隙如何设置成为0
    vim 配色方案(目测有上百个)
    Git 远程仓库的管理和使用
    vim 使用图
    Python 编程挑战
    python 网络爬虫
  • 原文地址:https://www.cnblogs.com/Afrafre/p/10594635.html
Copyright © 2011-2022 走看看