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

  • 相关阅读:
    mongodb删除指定字段
    nodejs地理坐标转换
    浅谈对腾讯云微信小程序解决方案服务端的理解(主要针对信道服务)
    利用Django进行微信支付接口的开发
    SpringBoot常用注解
    构建一个敏感词字典树
    Java异常统一处理
    [一天一个小知识]instanceof
    [总结]实现表格中对checkbox的操作
    小程序的数据绑定
  • 原文地址:https://www.cnblogs.com/straightup/p/13468288.html
Copyright © 2020-2023  润新知