zoukankan      html  css  js  c++  java
  • Django Rest Framework的request源码解析

    1. Django CBV下的request

    # 路由层
    from app import views
    urlpatterns = [
        url(r'^cbv/', views.CBVTest.as_view()),
    ]
    # 视图层
    from django.shortcuts import render, HttpResponse
    from django.views import View
    class CBVTest(View):
        # 通过调度(dispatch)分发请求
        def dispatch(self, request, *args, **kwargs):
            pass
            super().dispatch(request, *args, **kwargs)
            pass
    
        def get(self, request):
            return render(request, 'cbv.html')
    
        def post(self, request):
            return HttpResponse('cbv post method')
    <!-- 模板层 -->
    <form action="/cbv/" method="post">
        {% csrf_token %}
        <input type="text" name="usr">
        <button type="submit">提交</button>
    </form>

    2. DRF的简单示例

    # 1)安装drf:pip3 install djangorestframework
    # 2)settings.py注册app:INSTALLED_APPS = [..., 'rest_framework']
    # 3)基于cbv完成满足RSSTful规范的接口
    # 路由层
    from app import views
    urlpatterns = [
        url(r'^drf/', views.Drf.as_view()),
    ]
    # 视图层
    from rest_framework.views import APIView
    from rest_framework.response import Response
    user_list
    = [{'id': 1, 'name': 'Bob'}, {'id': 2, 'name': 'Tom'}] class Drf(APIView): def get(self, request, *args, **kwargs): return Response({ 'status': 0, 'msg': 'ok', 'results': user_list }) def post(self, request, *args, **kwargs): # request对formdata,urlencoded,json三个格式参数均能解析 name = request.data.get('name') id = len(user_list) + 1 user = {'id': id, 'name': name} user_list.append(user) return Response({ 'status': '0', 'msg': 'ok', 'results': user })

    3.request流程

    # as_view()
        # 核心走了父类as_view
        view = super(APIView, cls).as_view(**initkwargs)
        # 返回的是局部禁用csrf认证的view视图函数
        return csrf_exempt(view)
        
    # dispatch(self, request, *args, **kwargs)
        # 二次封装request对象
        request = self.initialize_request(request, *args, **kwargs)
        # 自定义request规则
        self.initial(request, *args, **kwargs)
        
    # initialize_request(self, request, *args, **kwargs)
        # 原生request封装在request._request
        
    # initial(self, request, *args, **kwargs)
        # 认证
        self.perform_authentication(request)
        # 权限
        self.check_permissions(request)
        # 频率
        self.check_throttles(request)

    走一遍:

    1 as_view()

    查看APIview 源码,我们可以发现它的 as_view()方法同样返回了view(),但是它的view其实是执行了父类的as_view()方法,所以也就是说APIView的as_view()方法依然返回了View的view() 如下图:

     2. dispath()

    进而继续跟进源码,View的view()方法返回self.dispatch(),但此时的self不是 View的实例对象,而是APIView的对象,所以我们需要去看APIView中的dispatch 方法,如下图所示

     

     

  • 相关阅读:
    activiti5.13 框架 数据库表结构说明
    c3p0详细配置
    linux+nginx+tomcat负载均衡,实现session同步
    Lvs+Keepalived+MySQL Cluster架设高可用负载均衡Mysql集群
    java jstack dump 线程 介绍 解释
    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
    CheckStyle使用手册(一)
    checkstyle使用介绍
    memcache启动多个服务
    temp
  • 原文地址:https://www.cnblogs.com/a438842265/p/12672705.html
Copyright © 2011-2022 走看看