• django下的 restful规范 Drf框架 psotman的安装使用 及一些容易遗忘的小点


    1.常用的前后端传输数据的方式
        在form表单里:
    	方式一:application/x-www-form-urlencoded
    	方式二:multipart/form-data
    	上述两种在后端通过POST获取对应数据,FILES获取文件数据
    
        利用ajax传输json类型的数据  
    	 contentType:'application/json'    
    

      

    2.不通过注释中间件,实现代码来跨过csrf的功能
    
    
      对于fbv而言,  
    	from django.views.decorators.csrf import csrf_exempt,csrf_protect
            @csrf_exempt   不校验
    	@csrf_protect   校验
    	
      对于cbv而言:
    	csrf_protect  存在三种,而csrf_exempt存在两种
    
    from django.utils.decorators import method_decorator
    from django.views import View
    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    
    # @method_decorator(csrf_exempt,name='dispatch')   这是第一种
    class Text(View):
        # @method_decorator(csrf_exempt)   第二种
        def dispatch(self, request, *args, **kwargs):
            res = super(Text, self).dispatch(request, *args, **kwargs)
            return res
    
        def get(self,*args,**kwargs):
            return HttpResponse('ok')
    
        def post(self,*args,**kwargs):
            return HttpResponse('okl')
    

      

    3.wsgi协议
      --->按http请求协议解析数据
    
      --->按http响应协议组装数据
        	
    wsgi协议其实是定义了一种server与application解耦的规范,django自带的wsgiref是对该协议的具体实现。
    
    此外,实现该协议的其他服务器:
        uwsgi:支持较高并发
        wsgiref == java中的tomcat
    
    wsgiref:支持并发量不高,django自带
    

      

    4.CBV源码分析
    
    from app01 import views
      url(r'^text2/',views.Text.as_view())
    	请求通过中间件后进入路由--》路由匹配成功,执行后面的类对应的函数--》本质是执行as_view所对应的View类下的闭包函数--》内部调用self.dispatch-->根据请求方式的不同,执行不同的自己定义的方法。
    

      

    5.符合restful规范的传输json类型的数据
    
    
    def bookss(request):
        if request.method == 'POST':
            books = models.Books.objects.all()
            li = [{'name':book.name,'publish':book.publish} for book in books]
            response = {'code':100,'msg':'查询成功','data':li}
            return JsonResponse(response,safe=False,json_dumps_params={'ensure_ascii':False})
        # #safe=False 如果序列化的对象中有列表,需要设置   'ensure_ascii':False  数据中含有中文,需要设置
        return render(request,'book.html')
    
    
    $('#b1').click(function () {
            $.ajax({
                url:'',
                type:'post',
                contentType: 'application/json',
                data:'',
                success:function (datas) {
                    {#alert(datas.name,datas.publish)#}
                    console.log(datas.msg);
                    console.log(datas.data[0].name);
                    console.log(datas.data[0].publish)
                }
            })
        })
    

      

    6.django自定义表名
    class User(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=16,db_column='姓名')
        # db_column  改变字段名
        age = models.IntegerField()
        class Meta:
            db_table = "User"
            # db_table  改变表名 
    
    自定义后,还是可以通过原先的名字去查询数据	
    

      

    7.restful规范
    
    1.REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”
    2.REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态
    3.REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”
    4.所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性
    5.对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)
    

      

    8.restful api 设计
    
    
    1.API与用户的通信协议,总是使用HTTPs协议。
    
    2.域名 
    https://api.example.com               尽量将API部署在专用域名(会存在跨域问题)
    https://example.org/api/               API很简单
    
    3.版本
    URL,如:https://api.example.com/v1/
    请求头                                                  跨域时,引发发送多次请求
    
    
    4.路径,网络上任何东西都是资源,均使用名词表示(可复数)
    https://api.example.com/v1/zoos
    https://api.example.com/v1/animals
    https://api.example.com/v1/employees
    
    
    5.method
    GET      :从服务器取出资源(一项或多项)
    POST    :在服务器新建一个资源
    PUT      :在服务器更新资源(客户端提供改变后的完整资源)
    PATCH  :在服务器更新资源(客户端提供改变的属性)
    DELETE :从服务器删除资源
    
    6.过滤,通过在url上传参的形式传递搜索条件
    https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
    https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置
    https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
    https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
    https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件
    
    7.状态码
    200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
    201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
    202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
    204 NO CONTENT - [DELETE]:用户删除数据成功。
    400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
    401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
    403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
    404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
    406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
    410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
    422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
    500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
    
    
    更多:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
    
    8.错误处理,应返回错误信息,error当做key。
    {
        error: "Invalid API key"
    }
    
    9.返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。
    
    GET /collection:返回资源对象的列表(数组)
    GET /collection/resource:返回单个资源对象
    POST /collection:返回新生成的资源对象
    PUT /collection/resource:返回完整的资源对象
    PATCH /collection/resource:返回完整的资源对象
    DELETE /collection/resource:返回一个空文档
    
    10.Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
    
    {"link": {
      "rel":   "collection https://www.example.com/zoos",
      "href":  "https://api.example.com/zoos",
      "title": "List of zoos",
      "type":  "application/vnd.yourformat+json"
    }}
    
    摘自:http://www.ruanyifeng.com/blog/2014/05/restful_api.html
    

      

    9.DRF框架的的介绍
    
    
       在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的。
        在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增、删、改、查的实现流程基本套路化,所以这部分代码也是可以复用简化编写的:
            增:校验请求数据 -> 执行反序列化过程 -> 保存数据库 -> 将保存的对象序列化并返回
            删:判断要删除的数据是否存在 -> 执行数据库删除
            改:判断要修改的数据是否存在 -> 校验请求的数据 -> 执行反序列化过程 -> 保存数据库 -> 将保存的对象序列化并返回
            查:查询数据库 -> 将数据序列化并返回
    
    
    Django REST framework可以帮助我们简化上述两部分的代码编写,大大提高REST API的开发速度。
    
    认识Django REST framework
        Django REST framework 框架是一个用于构建Web API 的强大而又灵活的工具。
    
        通常简称为DRF框架 或 REST framework。
    
        DRF框架是建立在Django框架基础之上,由Tom Christie大牛二次开发的开源项目。
    
    特点:
        提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
        提供了丰富的类视图、Mixin扩展类,简化视图的编写;
        丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
        多种身份认证和权限认证方式的支持;
        内置了限流系统;
        直观的 API web 界面;
        可扩展性,插件丰富
    

      

    10.DRF的安装使用:
    
    在终端里的安装
        pip3 install djangorestframework       (windows环境下,pip会将下载的第三方包存放在以下路径:[your path]Python36Libsite-packages中)
    
        在pycharm下的settings安装
            
        pycharm下的终端里通过 pip3 install djangorestframework   下载,直接将该模块安装在该项目下的解释器里
    
    
    使用:
               
    第一步,在视图里,必须写 CBV
    	from rest_framework.views import  APIView
    		class Book(APIView):
    			pass
    第二步:在settings配置
                INSTALLED_APPS= [
    					。。。。。
    				'rest_framework'
    			]
    

      

    继承APIView后的源码分析 :图片如下

    结论:

    继承了APIView 之后:
    -1 所有的请求都没有csrf的认证了
    -2 在APIView中as_view本质还是调用了父类View的as_view(View的as_view)
    -3 as_view中调用dispatch -----》这个dispatch是APIView的dispatch

    APIView的dispatch , request的源码分析

    -APIVIew的dispatch方法:
    	-1 对原生request对象做了一层包装(面向对象的封装),以后再用的request对象都新的request对象
    	-2 在APIView中self.initial(request, *args, **kwargs),里面有频率控制,权限控制和认证相关
    	-3 根据请求方法执行咱们写的视图类中的相应方法
    		--视图类中方法的request对象,已经变成了封装后的request
    -Request类:
    	-1 原生的request是self._request
    	-2 取以post形式提交的数据,从request.data中取(urlencoded,formdata,json格式)
    	-3 query_params 就是原生request的GET的数据
    	-4 上传的文件是从FILES中取
    	-5 (重点)其他的属性,直接request.属性名(因为重写了__getattr__方法)
    
    
    # 必须写cbv
    from rest_framework.views import  APIView
    class Books(APIView):
        def get(self,request):
            #request是被封装后的request,原生的request在request._request
            #如果想用原生requset中的属性,还是原来的用法,因为Request重写了__getattr__方法
            # 原生django只能处理urlencoded和formdata编码,如果是json格式,原生django是不能处理的,需要自己从body中取出来自行处理
            # request.data 不管前端传数据的编码格式是urlencoded,formdata或者是json,都从里面取值
            # request.data
            #request.query_params  是原来django原生的GET中的数据
            #self.FILES  就是上传的文件
            dic={'name':'lqz','age':30,'height':178,'wife':['liuyifei','dilireba','egon']}
            return JsonResponse(dic)
    

      

    postman的功能:
    
        模拟前端向接口发送请求,测试接口
    
    将其数据更美观的展示出来: https://www.json.cn/
    

      

  • 相关阅读:
    Promise笔记
    srping-cloud-stream集成rocketmq
    mysql锁
    profiling分析
    mysql慢查询
    sql语句中in与exists的使用区别
    数据库死锁的解决办法
    死锁的形成以及处理
    百万数据修改索引,百万数据修改主键
    创建视图索引
  • 原文地址:https://www.cnblogs.com/changwenjun-666/p/11117231.html
Copyright © 2020-2023  润新知