Django-djangorestframework-请求模块-获取请求参数
请求模块
主要是分析 drf 二次封装后的 request 对象
以及怎么拿到请求传递过来的数据(url 拼接的数据,数据包传过来的数据)
源码分析
源码查看,从 as_view 进到 APIView 类的 dispatch 方法,dispatch 中的 request = self.initialize_request(request, *args, **kwargs) 中入手
rest_framework.views.APIView#dispatch
# ...
	def dispatch(self, request, *args, **kwargs):
        """
        `.dispatch()` is pretty much the same as Django's regular dispatch,
        but with extra hooks for startup, finalize, and exception handling.
        """
        self.args = args
        self.kwargs = kwargs
        # 请求模块
        request = self.initialize_request(request, *args, **kwargs)
        self.request = request
        self.headers = self.default_response_headers  # deprecate?
        try:
            # 三大认证模块
            self.initial(request, *args, **kwargs)
            # Get the appropriate handler method
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(),
                                  self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed
            response = handler(request, *args, **kwargs)
        except Exception as exc:
            response = self.handle_exception(exc)
        self.response = self.finalize_response(request, response, *args, **kwargs)
        return self.response
rest_framework.views.APIView#initialize_request
    def initialize_request(self, request, *args, **kwargs):
        """
        Returns the initial request object.
        """
        parser_context = self.get_parser_context(request)
        return Request(
            request,
            parsers=self.get_parsers(),
            authenticators=self.get_authenticators(),
            negotiator=self.get_content_negotiator(),
            parser_context=parser_context
        )
rest_framework.request.Request#__init__
    def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        assert isinstance(request, HttpRequest), (
            'The `request` argument must be an instance of '
            '`django.http.HttpRequest`, not `{}.{}`.'
            .format(request.__class__.__module__, request.__class__.__name__)
        )
		# 二次封装 request,将原生 request 作为 drf request 对象的 _request 属性
        self._request = request
        # 虽然 drf 对 request 对象做了二次封装,但是它也做了完全兼容(见下面的 __getattr__ 方法)
        self.parsers = parsers or ()
        self.authenticators = authenticators or ()
        self.negotiator = negotiator or self._default_negotiator()
        self.parser_context = parser_context
        self._data = Empty
        self._files = Empty
        self._full_data = Empty
        self._content_type = Empty
        self._stream = Empty
        if self.parser_context is None:
            self.parser_context = {}
        self.parser_context['request'] = self
        self.parser_context['encoding'] = request.encoding or settings.DEFAULT_CHARSET
        force_user = getattr(request, '_force_auth_user', None)
        force_token = getattr(request, '_force_auth_token', None)
        if force_user is not None or force_token is not None:
            forced_auth = ForcedAuthentication(force_user, force_token)
            self.authenticators = (forced_auth,)
rest_framework.request.Request#__getattr__ 做了特殊兼容
    def __getattr__(self, attr):
        """
        If an attribute does not exist on this instance, then we also attempt
        to proxy it to the underlying HttpRequest object.
        """
        try:
            # 对原有的 request 做了完全兼容
            return getattr(self._request, attr)
        except AttributeError:
            return self.__getattribute__(attr)
正式使用
--> 所以在 APIView 视图类的方法中我们可以这样写
所以以后
- url 拼接的参数都可以用
 request.query_params来取- 所有请求的数据包方式数据都可以用
 request.data来取,所有数据方式(from-data、json...)它都做解析了
class Test(APIView):
    def get(self, request, *args, **kwargs):
        # 获取 url 拼接的参数
        print(request._request.GET)  # 二次封装
        print(request.GET)  # 兼容
        print(request.query_params)  # 扩展,推荐用这个
        return Response("drf get ok.")
	def post(self, request, *args, **kwargs):
        # 获取 url 拼接的参数 (所有请求方式都可以携带这个)
        print(request._request.GET)
        print(request.GET)  # 兼容
        print(request.query_params)  # 扩展,推荐用这个
        # 获取 post 参数
        print(request._request.POST)  # 拿不到 json 的数据
        print(request.POST)  # 兼容,拿不到 json 的数据
        print(request.data)  # 扩展,兼容性最强,三种数据方式都可以,推荐用这个
        return Response("drf post ok")
总结
- drf 对原生 request 做了二次封装,
request._request就是原生 request - 原生 request 对象的属性和方法都可以被 drf 的 request 对象直接访问(向下兼容)
 - drf 请求的所有 url 拼接参数都被解析到 
request.query_params中,所有数据包数据都被解析到request.data中 
任何请求都可以通过 url 拼接参数来传递参数,同样通过 request.query_params 获取
Django-djangorestframework-请求模块-获取请求参数的更多相关文章
- ServletRequest HttpServletRequest  请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
		
ServletRequest 基本概念 JavaWeb中的 "Request"对象 实际为 HttpServletRequest 或者 ServletRequest, ...
 - Asp.Net Core获取请求信息/获取请求地址
		
一.Asp.Net Core 2.0版本中目前HttpRequest是个抽象类 在控制器或视图上下文中获取到的 Request对象,是 DefaultHttpRequest的实例. 定义 如图 : ...
 - 【异常】postman能够请求成功获取到参数,前端请求的却请求不到
		
1 前端联调的时候,反馈自己的参数没有生效,无论传递任何参数都是一样的结果 盯了一下日志发现 postman请求的是 :{"getParameter":{"provi ...
 - url、querystring模块获取请求request.url中的不同部分图解
		
url.parse(string).query | url.parse(string).pathname | | | | | ------ ------------------- http://loc ...
 - Django-开放静态资源-获取请求携带的数据-pychram连接数据库-修改Django默认数据库-DjangoORM操作--表管理-记录管理-01
		
目录 关于静态资源访问 为什么要配置静态文件才能获取静态资源 常见的静态文件种类 如何配置来开启访问权限 禁用浏览器缓存 django的自动重启机制(热启动) 静态文件接口动态解析 向服务器发送数据 ...
 - SpringMvc如何获取请求头请求体的消息
		
对接第三方服务,说传递的POST请求中,Request Header中有需要的参数,Request Body为XML格式,包括创建消息正文和属性. 刚开始我以为可以通过 HttpServletRequ ...
 - yii学习笔记(4),获取请求数据的request组件
		
yii在控制器中获取请求数据需要通过request组件来完成 <?php namespace app\controllers; use yii; use yii\web\Controller; ...
 - SpringBoot web获取请求数据【转】
		
SpringBoot web获取请求数据 一个网站最基本的功能就是匹配请求,获取请求数据,处理请求(业务处理),请求响应,我们今天来看SpringBoot中怎么获取请求数据. 文章包含的内容如下: 获 ...
 - request获取请求头和请求数据
		
package cn.itcast.request; import java.io.IOException; import java.io.InputStream; import java.io.Pr ...
 
随机推荐
- CF1197B
			
CF1197B 题意: 出n个柱子,每个柱子一个圆盘,其半径各不相同,每次只能将柱子上只有一个圆盘的移到相邻位置,问能否全部移到一个柱子上. 解法: 思路题. 如果所有盘子都能移动到同一个柱子上,那么 ...
 - debian、ubuntu安装metasploit通用方法
			
网上有很多方法让去github上下载安装,这方法的确可以但是特别慢,更新也特别慢,这里写下比较快的方法 1.添加kali源 vim /etc/apt/sources.list 在原有源的基础上添加国内 ...
 - Flutter生成带图片的二维码
			
现在的APP中经常需要用自己的信息生成一个二维码给别人扫,下面就介绍一下Flutter中怎么生成一个带图片的二维码. 需要用到的插件qr_flutter 首先在 pubspec.yaml 文件中添加以 ...
 - mvc partialView断点调试问题
			
mvc中的partialview 在前端f12调试时,默认看不到代码的. 在Js中加上debugger; 调试时会走到断点,多出个VM打头的局部视图页面.
 - [.NET] ConfuserEx脱壳工具打包
			
[.NET] ConfuserEx脱壳工具打包 ConfuserEx 1.0.0脱壳步骤 Written by 今夕何夕[W.B.L.E. TeAm] 1.先用UnconfuserEx把 ...
 - python 中对象is和==是怎么比较的
			
Python中的对象包含三要素:id.type.value.其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值.is判断的是a对象是否就是b对象,是通过id来判断的.==判断的 ...
 - LightGBM两种使用方式
			
原生形式使用lightgbm(import lightgbm as lgb) import lightgbm as lgb from sklearn.metrics import mean_squar ...
 - 性能优化 | JVM性能调优篇——来自阿里P7的经验总结
			
VM 调优概述: 性能定义: 吞吐量 - 指不考虑 GC 引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标. 延迟 - 其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收 ...
 - 《你不知道的JavaScript(上)》笔记——作用域闭包
			
当函数可以记住并访问所在的词法作用域时, 就产生了闭包, 即使函数是在当前词法作用域之外执行. function wait(message) { setTimeout( function timer( ...
 - Android与JS交互,json传参问题
			
一.JS调用Android的方法 JS调用安卓的方法,并且传递的参数为json格式的字符串(JSONObject.toString()), 例如: var json = {"name&quo ...