准备:

  下载 pip install djangorestframework

一 APIView源码解析

1 预备知识

CBV(class based view)
FBV(function based view)

2 CBV源码

    class LoginView(View):

        def get(self,request):
return render(request,"login.html") url(r'^index/', views.index), #url(r'^login/', views.LoginView.as_view()),
#url(r'^login/', View.view), 一旦用户get访问login:
#login-----》view(request):
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs):
# 分发
handler = getattr(self, request.method.lower()) return handler(request, *args, **kwargs):
def get(self,request):
return render(request,"login.html")

3 restful协议

  1 所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性

  2 面向资源架构(ROA:Resource Oriented Architecture)

  3

    不符合规范:
      127.0.0.1:8000/books
      127.0.0.1:8000/books/add/
      127.0.0.1:8000/books/change/1
      127.0.0.1:8000/books/delete/1

    http协议请求方式:GET POST,DELETE,PUT,PATCH,OPTION.HEAD

    GET:查看数据
    POST:提交数据添加数据库

      GET
    books-------->查看数据--------------------> 返回所有数据列表 :[{},{},{}]
      POST
    books-------->添加数据--------------------->返回添加数据 :{}
      PUT
    books/1------->更新pk=1的数据--------------->返回更新后的数据: {}
      Delete
    books/1-------> 删除pk=1的数据-------------->返回空
      GET
    books/1------->查看单条数据 --------------->返回查看的单条数据 {}

4 Django RestFramework (DRF)--------------app

  (1) APIView (*****)
  (2) 序列化组件(*****)
  (3) 视图类(mixin)(*****)
  (4) 认证组件
  (5) 权限组件
  (6) 频率组件
  (7) 分页组件
  (8) 解析器组件(*****)
  (9) 响应器组件
  (10) url控制器

class CourseView(APIView):
  def get(self,request):
    course_list=Course.objects.all()
    ret=[]
    for course in course_list:
      ret.append({
      "title":course.title,
      "desc":course.desc,
      })
    return HttpResponse(json.dumps(ret,ensure_ascii=False))

  ----APIView:

    # url(r'^courses/', views.CourseView.as_view()),
    # url(r'^courses/', APIView.as_view()),
    # url(r'^courses/', APIView.as_view()),
    # url(r'^courses/', View.view),
  一旦用户访问:

    courses--------> view(reqeust):
        self = cls(**initkwargs)
        return self.dispatch(request, *args, **kwargs) # APIView.dispatch()
          def dispatch(request, *args, **kwargs):

            # 1 重装一个新的request对象

            # 2 认证组件,权限组件,频率组件

            handler = getattr(self, request.method.lower())
            response = handler(request, *args, **kwargs)
            return response

csrf_exempt(view)

  如果有csrf_token则,正常返回数据

  没有则返回空数据

二 解析器组件

http协议的数据发送:

问题:如何发送json数据服务器

基于http协议
BS架构: Browser ------------------ Server

b'''
POST /login/ HTTP/1.1
...
...

contentType:application/x-www-form-urlencoded
user=yuan&pwd=123&a=1

contentType:application/json
{"user":"yuan","pwd"}

'''

JS Python

JSON.Stringfy(data) ============ json.dumps(data)
JSON.parser(data) ============ json.loads(data)

Django默认解析器:
  if contentType:application/x-www-form-urlencoded:
    user=yuan&pwd=123&a=1 -----》request.POST={"user":"yuan","pwd"}
  else:
    request.POST={}

解析器组件功能:

  预备知识

    1 request.body:可以得到请求体中的原生数据

    2 django自带的解析只支持,不支持json等其他类型

      contentType:application/x-www-form-urlencoded

      contentType:multipart/form-data

    3 ajax中定义发送数据的类:contentType

    4 js的json序列化:JSON.stringify({name:'alex',pwd:'122'})

  解析器组件:

    可以解析json等各种类型的数据

    

      

最新文章

  1. hadoop学习笔记:zookeeper学习(上)
  2. MVP的PV模式与SC模式
  3. 基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用
  4. PowerShell连接中国Azure
  5. 2搭建Android开发环境
  6. 【JavaScript】对比12 款优秀的JavaScript MVC/MVVC框架 你最喜欢Backbone or Ember
  7. Android 设置隐式意图
  8. java中的信号量Semaphore
  9. AdHoc发布时出现重复Provisioning Profile的解决方案
  10. 如何在sharepoint里通过correlation id查找详细的错误信息
  11. JavaScript的异步机制
  12. zzuli 1816: 矩形 排序思维
  13. 用samba来创建windows下的文件共享
  14. TCP的概念
  15. uva-507
  16. js数组去除重复数据
  17. 如何将已有的本地Git 库推送到远端仓库?
  18. LL(1)文法分析表的构造和分析过程示例
  19. 部署不能产生class文件的问题
  20. myeclipse6.6+maven跑springside4.1的demo

热门文章

  1. SAS学习笔记45 宏系统选项及其他
  2. Jfinal初次尝试及Jetty使用相关问题
  3. Bloom过滤器
  4. Git 常用命令 MD
  5. [APB VNext 笔记] UI
  6. SSRF(服务端请求伪造)
  7. MySQL之日期时间函数
  8. 利用jenkens+github实现简单的CI/CD
  9. Linux上使用trash回收机制来替换rm命令
  10. tcp关闭连接:挥手讨论