request请求生命周期

request请求生命周期

一、request请求分析

1.1. request数据请求

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.http.request import QueryDict
class BookAPIView(APIView):

    def get(self, request, *args, **kwargs):
        print(request._request.GET)  # 原生wigs中值
        print(request.GET) # 二次封装的值
        print(request.META) # 所有get请求信息
        print(request.META.get("HTTP_AUTH")) # 前台发来的头都会大写并加上HTTP
        print(request.query_params) # 所有url数据

        print(request.POST) # get请求不能获取Post请求数据

        return Response('get ok')

    def post(self, request, *args, **kwargs):
        print(request._request.POST)  # 原生wigs中值
        print(request.POST) # 二次封装的值
        print(request.data) # 所有post请求数据
        print(request._request) # url数据包<WSGIRequest: POST '/books/?age=123'>
        print(request.GET) # POST请求可以Post请求数据

         # QueryDict转为
        print(request.query_params.dict())
        if isinstance(request.data, QueryDict):
            print(request.data.dict())

        return Response('post ok')

# urls.py
from . import views
urlpatterns = [
    url(r'^books/$', views.BookAPIView.as_view()),
]

总结:

  1. drf中的request是在wsgi的request基础上进行再一次封装
  2. 将wsgi的request作为drf的request的一个属性, _request
  3. drf中的request对wsgi中的request做完全兼容,新的可以直接获取wsgi中的数据
  4. drf中的request对数据解析更规范化,所有的拼接参数(url?age=18)都解析到了query_params中,所有数据报数据都解析到data中
  5. query_params和data属于QueryDict类型,可以通过.dict()转化为字典类型

二、request请求源码分析

# 1. 2. urls.py
from . import views
urlpatterns = [
    url(r'^books/$', views.BookAPIView.as_view()),
]

#3.调用drf中的as_view
@classmethod
def as_view(cls, **initkwargs):     # cls 为 views.BookAPIView类
    ...
    view = super().as_view(**initkwargs) # as_view原生的as_view,super() 为 view
    view.cls = cls
    view.initkwargs = initkwargs

    return csrf_exempt(view)
# 4.进入drf中dispatch
def dispatch(self, request, *args, **kwargs):   # self为views.BookAPIView类
    self.args = args
    self.kwargs = kwargs
    # 对原生request进行了二次封装
    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

# 4.1 返回封装的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
    )
# 5.Request类创建 self._request = request自己的属性
 def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        assert isinstance(request, HttpRequest), (

            .format(request.__class__.__module__, request.__class__.__name__)
        )

        self._request = request
        self.parsers = parsers or ()
        self.authenticators = authenticators or ()
        self.negotiator = negotiator or self._default_negotiator()
        self.parser_context = parser_context

#6.如何实现获取wgis中的属性
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:
        return getattr(self._request, attr)
    except AttributeError:
        return self.__getattribute__(attr)

  1. 导入drf中的APIView并创建类继承它,在配置url: url(r‘^books/$‘, views.BookAPIView.as_view()),
  2. 当项目启动时会执行drf中的as_view()方法,返回view方法(局部禁用了csrf认证), url:url(r‘^books/$‘, views.BookAPIView.view
  3. 浏览器发送请求来时则会执行url中view函数,在执行view中返回的是 self.dispatch(request, *args, **kwargs), dispatch是drf中的dispatch, 不是wsgi中原生的dispatch
  4. 进入drf中的dispatch首先会对原生的request进行二次封装:request = self.initialize_request(request, *args, **kwargs),在initialize_request方法中返回了一个request实例对象
  5. 进入request.py中的Request方法中就会发现在初始化方法中将wsgi方法的request变为了自己的一个属性: ‘self._request = request‘
  6. request通过反射的方法获取wsgi中request属性,当request.获取属性先到 _request中查找,没有则查自己本身的
    #6.如何实现获取wgis中的属性
    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:
            return getattr(self._request, attr)
        except AttributeError:
            return self.__getattribute__(attr)
  7. 核心
    • 走drf的Request初始化方法__init__:self._request = request
    • drf的Request的getter方法__getattr__:先从self._request反射取属性,没取到再从drf的request中取
    • request除了可以访问原wsgi协议的request所有内容,还可以访问 query_params、data

原文地址:https://www.cnblogs.com/randysun/p/12290077.html

时间: 2024-07-31 23:36:07

request请求生命周期的相关文章

DJANGO入门系列之(Django请求生命周期and路由层)

昨日回顾 1 orm 创建表,新增字段,修改,删除字段,不能创建数据库 -字段属性phone=models.CharField(max_length=64,null=True) -null=True 代表该列可以为空 2 数据的增删改查 -增(1):User.objects.create(address='') -增(2):实例化产生一个user对象,user对象的save方法 -删:User.objects.filter(id=1,name='lqz').first().delete() -删

Django的请求生命周期与中间件中的5中方法

请求生命周期: 客户端——>WSGI——> 中间件——>路由匹配——>视图函数——>WSGI——>客户端 中间件: 在全局层明处理请求和响应的 form django.utils. deprecation import MiddlaraMixin 5种方法与4个要点:执行顺序,执行时间,参数,返回值 方法:process_request process_views process_exception process_response process_template_r

Django请求生命周期和ORM

dajngo请求生命周期 django请求生命周期是:当用户在browser点击URL后,在django后台都发生了什么. 请求响应Http 1.发送Http请求 2.服务器接收,根据请求头中url在路由关系表中进行匹配(从上到下) 3.匹配成功后,执行指定的views函数 URL –>函数 --->FBV URL –>类     --->FBV 4.业务处理 根据个人需求自定 操作数据库 原生SQL Django ORM ---->返回给用户的结果<----- -响应

面试-Django框架请求生命周期

先看一张图吧! 1.请求生命周期 - wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask.Django) - 中间件,帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf.request.session - 路由匹配 - 视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm.templates => 渲染 - 中间件,对响应的数据进行处理. - wsgi,将响应的内容发送给浏览器. 2.什么wsgi wsgi:

rest_framework框架的封装特点和APIView请求生命周期

rest_framework框架的封装特点: import rest_framework from rest_framework.views import APIView from rest_framework.request import Request 在views.py中写出合适的api类,只需要继承rest_framework中generics中的某个类,重写我们需要的方法实现合适的逻辑即可 APIView请求生命周期 """ APIView的as_view(局部禁用

APIView请求生命周期

今日总结 """ 1.APIView请求生命周期 APIView的as_view(局部禁用csrf) => 走父级的as_view调用dispatch分发请求 => APIView自己重写了dispatch,使用自己完成分发 => 分发前完成request二次封装.数据解析 => 三大认证 => 请求的实际响应(自己的视图类的处理分发) => 出现了异常,就会交给异常模块处理异常 => 响应模块完成响应.渲染模块可以json或浏览器两

Django框架进阶7 django请求生命周期流程图, django中间件, csrf跨站请求伪造, auth认证模块

django请求生命周期流程图 djang中间件 它是django的门户 只要是全局相关的功能你都应该考虑使用django中间件来帮你完成 全局用户身份校验 全局用户访问频率校验 用户访问黑名单 用户访问白名单 # 只要以后用django开发业务 设计到全局相关的功能 你就考虑用中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.Sessio

详解ASP.NET MVC的请求生命周期

本文的目的旨在详细描述asp.net mvc请求从开始到结束的每一个过程. 我希望能理解在浏览器输入url并敲击回车来请求一个asp.net mvc网站的页面之后发生的任何事情. 为什么需要关心这些?有两个原因.首先是因为asp.net mvc是一个扩展性非常强的框架.例如,我们可以插入不同的viewengine来控制网站内容呈现的方式.我们还可以定义控制器生成和分配到某个请求的 方式.因为我想发掘任何asp.net mvc页面请求的扩展点,所以我要来探究请求过程中的一些步骤. 其次,如果你对测

[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(四)

不使用特殊方法来处理请求生命周期事件 HttpApplication 类是全局应用类的基类,定义了可以直接使用的一般 C# 事件.那么使用标准 C# 事件还是特殊方法那就是个人偏好的问题了,如果喜欢,也可以将这两种方式混合起来使用. 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 using System.W