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 方法,如下图所示

     

     

  • 相关阅读:
    javaweb消息中间件——rabbitmq入门
    virtual box 桥接模式(bridge adapter)下无法获取ip(determine ip failed)的解决方法
    Apache Kylin本地启动
    git操作
    Java学习总结
    Java中同步的几种实现方式
    hibernate exception nested transactions not supported 解决方法
    vue 中解决移动端使用 js sdk 在ios 上一直报invalid signature 的问题解决
    cookie 的使用
    vue 专门为了解决修改微信标题而生的项目
  • 原文地址:https://www.cnblogs.com/a438842265/p/12672705.html
Copyright © 2011-2022 走看看