zoukankan      html  css  js  c++  java
  • Django学习10

    django请求生命周期

    请求 -- wsgi封装socket和http协议解包 -- 顺序执行中间件 -- url控制器 -- view视图函数 -- 倒序执行中间件 -- wsgi按http协议封装响应数据 -- 响应
    

    中间件

    自定义中间件

    1.应用下创建一个文件夹,文件夹下面创建一个xx.py文件
    from django.utils.deprecation import MiddlewareMixin
    class MD1(MiddlewareMixin):
    	def process_request(self,request):
    		...
    	def process_response(self,request,response):
    		...
    		return response
    2.在settings.py  MIDDLEWARE 中写入自定义中间件的路径(多个中间件的话注意摆放顺序)
    

    中间件方法

    1.process_request方法(*):
        def process_request(self,request):
    		...
    # 它的返回值为None或者HttpResponse对象.返回值如果为None,交给下一个中间件处理,流程正常.如果是HttpResponse对象,则直接开始返回流程,并将该HttpResponse作为response返回给浏览器;
    # 多个中间件中的process_request方法是按照MIDDLEWARE中的注册顺序 顺序 执行的.
    
    2.process_view方法:
        def process_view(self, request, view_func, view_args, view_kwargs):
            ...
    # 执行视图函数之前执行;
    # view_func是Django即将使用的视图函数.
    
    3.process_exception方法:
        def process_exception(self, request, exception):
            ...
    # 视图函数出错才会执行.
    
    4.process_template_response方法(比较复杂,而且用的比较少):
        def process_template_response(self, request, response):
            ...
    # 它的参数,request是HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生);
    # process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法.注意!此render()不是我们平时模板渲染的方法!
    views.py:
        def index(request):
            print('我是index视图函数')
    		def render():
                print('我是自定义的render')
                return HttpResponse('我是自定义的render方法的返回值')	# 最后页面拿到的结果是这个
            ret = HttpResponse('我是index视图函数的返回值')   # 这个HttpRequest对象的内容没有意义,会被覆盖
            ret.render = render		# 将自定义的render方法作为属性封装给了HttpRequest对象
            return ret
    自定义中间件:
        def process_template_response(self, request, response):
            ...
            return response		# 这个方法也必须要返回response
    
    5.process_response方法(*):
        def process_response(self,request,response):
    		...
    		return response
    # response是视图函数返回的HttpResponse对象.该方法必须返回HttpResponse对象;
    # 多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序 倒序 执行的.
    
    
    

    小结:搞清楚整个django请求的生命周期是重点,这样才能知道哪个环节可以拓展.中间件的学习重点在于搞清楚中间件的执行顺序,以及其方法的执行顺序,在做这方面项目或练习的时候最好画个草图,这样逻辑会更加清晰.

  • 相关阅读:
    Oracle merge
    ORA-1461 encountered when generating server alert SMG-3500
    COALESCE NVL NVL2 DECODE
    oracle限制ip訪問
    java动态代理实现与原理详细分析
    MySql/Oracle树形结构查询
    微信公众号Java接入demo
    支付宝转账
    支付宝 查看订单 退款
    linux网络编程--UNIX域套接字
  • 原文地址:https://www.cnblogs.com/straightup/p/13468288.html
Copyright © 2011-2022 走看看