Django RESTful规范

Django生命周期

  1. 先进入实现了wsgi协议的web服务器
  2. 进入Django
  3. 中间件
  4. 路由
  5. 视图函数
  6. 取模板,取数据,用数据渲染模板
  7. 返回模板的字符串

开发模式

  1. 前后端不分离项目
  2. 前后端分离项目(前端和后端通过json格式数据交互)

CBV源码分析

cbv路由配置:url(r’^test/’, views.Test.as_view()),

  1. 请求通过中间件进入路由

  2. 根据路由匹配,匹配成功执行后面函数(自动传入request)

    as_view()返回的结果就是--—> view,本质就是执行了as_view内部的view函数

  3. view内部又调用了self.dispatch(类的查找:不管什么时候调用什么先去自己类里面找,没有就去自己的父类里面找)

  4. 根据请求方式,执行不同的方法(会执行自己写的视图类的方法)

补充:重写dispatch方法,可以再执行父类的dispatch之前,进行一些逻辑判断((最后要重用父类dispatch方法)

restful规范

REST与技术无关,代表的是一种软件架构风格,对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构

restful API设计规范

  1. API与用户的通信协议,总是使用HTTPs协议

  2. 域名有区别

  3. 版本

  4. 路径,视网络上任何东西都是资源,均使用名词表示(重点)

  5. 通过method区分操作种类

    • GET:从服务器取出资源(一项或多项)
    • POST:在服务器新增一个资源
    • PUT:在服务器更新资源(客户端提供改变后的完整资源)
    • PATCH:在服务器更新资源(客户端提供改变的属性)
    • DELETE:从服务器删除资源
  6. 过滤,通过在url上传参的形式传递搜索条件

  7. 状态码

  8. 错误处理,应返回错误信息

  9. 返回结果,针对不同操作,服务器向用户返回的结果

    • -get获取所有资源/get获取一个资源
      -127.0.0.1/api/vi/books 获取所有图书

      ​ -127.0.0.1/api/vi/books/3 获取id为3的图书
      ​ {“status_code”:100,’msg’:’获取成功’,data:{name:xx,..….}}

    • -新增数据,把新增的数据再返回

    • -修改了数据,返回完整的资源对象

    • -删除数据,返回一个空文档

  10. 返回结果中提供链接

基于原生django开发restful的接口

def books(request):
    # 获取所有图书
    if request.method=='GET':
        books=models.Book.objects.all()
        ll=[{'name':book.name,'publish':book.publish} for book in books]
        response={'code':100,'msg':'查询成功','data':ll}
        # safe=False 如果序列化的对象中有列表,需要设置safe
        # 如果有中文,可以通过json_dumps_params传入,内部代码会解压赋值
        return JsonResponse(response,safe=False,json_dumps_params={'ensure_ascii':False})

drf:APIView的源码,Request的源码

  1. 安装

    1. -pip3 install djangorestframework
    2. -pycharm中安装
  2. 使用

    1. 写视图函数,都要写CBV

      from rest_framework.views import  APIView
      class Books(APIView):
      	pass
      
    2. 在setting中配置

      INSTALLED_APPS= [
      					。。。。。
      				'rest_framework'
      			]
      

源码分析

  1. 继承了APIView之后:

    1. 所有的请求都没有csrf的认证
    2. 在APIView中as_view本质上还是调用了父类的as_view(View的as_view)
    3. as_view中调用dispatch -–-–> 这个dispatch是APIView中的dispatch
  2. APIView的dispatch方法

    1. 对原生request对象做了一层包装(面向对象的封装),以后再用的request对象都是新的request对象

    2. 在APIviiew中self.initial(request,*args,**kwargs),里面有频率,控制,权限控制和认证相关的方法

    3. 根据请求方法执行自己写的视图类中的相应方法

      • 视图类中方法的request对象,已经变成了封装后的request
  3. Request类:

    1. 原生的request是self._request
    2. 取以post形式提交的数据,从request.data中取(urlencoded,formdata,json格式均在data中)
    3. query_params就是原生request中的GET的数据
    4. 上传的文件是从FILES中取
    5. (重点)其他的属性,直接request.属性名(因为重写了 _ getattr _方法)
posted @ 2019-07-01 18:57  Lip&Hip  阅读(290)  评论(0)    收藏  举报