ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django之request进入中间件《二》

2020-05-21 19:04:21  阅读:290  来源: 互联网

标签:中间件 middleware request Django callback resolver response view


 1     def _get_response(self, request):
 2         """
 3         Resolve and call the view, then apply view, exception, and
 4         template_response middleware. This method is everything that happens
 5         inside the request/response middleware.
 6         """
 7         response = None
 8 
 9         if hasattr(request, 'urlconf'):
10             urlconf = request.urlconf
11             set_urlconf(urlconf)
12             resolver = get_resolver(urlconf)
13         else:
14             resolver = get_resolver()
15         resolver_match = resolver.resolve(request.path_info)
16         callback, callback_args, callback_kwargs = resolver_match
17         request.resolver_match = resolver_match
18 
19         for middleware_method in self._view_middleware:
20 
21             """
22             <bound method
23              CsrfViewMiddleware.process_view of 
24              <django.middleware.csrf.CsrfViewMiddleware object at 0x034B1388>>
25             """
26             response = middleware_method(request, callback, callback_args, callback_kwargs)
27             if response:
28                 break
30         if response is None:
31             wrapped_callback = self.make_view_atomic(callback)
32             try:
33 
34                 response = wrapped_callback(request, *callback_args, **callback_kwargs)
35             except Exception as e:
36                 response = self.process_exception_by_middleware(e, request)
37 
38         # Complain if the view returned None (a common error).
40         if response is None:
41             if isinstance(callback, types.FunctionType):    # FBV
42                 view_name = callback.__name__
43             else:                                           # CBV
44                 view_name = callback.__class__.__name__ + '.__call__'
45 
46             raise ValueError(
47                 "The view %s.%s didn't return an HttpResponse object. It "
48                 "returned None instead." % (callback.__module__, view_name)
49             )
50 
51         # If the response supports deferred rendering, apply template
52         # response middleware and then render the response
53         elif hasattr(response, 'render') and callable(response.render):
54             for middleware_method in self._template_response_middleware:
55                 response = middleware_method(request, response)
56                 # Complain if the template response middleware returned None (a common error).
57                 if response is None:
58                     raise ValueError(
59                         "%s.process_template_response didn't return an "
60                         "HttpResponse object. It returned None instead."
61                         % (middleware_method.__self__.__class__.__name__)
62                     )
63 
64             try:
65                 response = response.render()
66             except Exception as e:
67                 response = self.process_exception_by_middleware(e, request)
68         return response

图解:

  

     在执行完slef._get_response()后,程序会继续执行_middlware_chain 函数栈中的process_response

总结:关于中间件中的request/response

  

标签:中间件,middleware,request,Django,callback,resolver,response,view
来源: https://www.cnblogs.com/zengmu/p/12932687.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有