zoukankan      html  css  js  c++  java
  • Django RestFramework (DRF)

    准备:

      下载 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等各种类型的数据

        

          

  • 相关阅读:
    Java EE javax.servlet中的ServletContext接口
    Java EE javax.servlet中的ServletConfig接口
    MD5加密工具
    redis常见数据操作
    Java文件上传与下载
    JSP技术
    spring集成swagger
    freemarker模板引擎的使用
    log4j生成日志
    Java自定义注解
  • 原文地址:https://www.cnblogs.com/benson321/p/9662537.html
Copyright © 2011-2022 走看看