def load_mIDdleware(self):
"""
Populate mIDdleware Lists from settings.MIDDLEWARE.
Must be called after the environment is fixed (see __call__ in subclasses).
"""
self._vIEw_mIDdleware = []
self._template_response_mIDdleware = []
self._exception_mIDdleware = []
handler = convert_exception_to_response(self._get_response) #为返回视图的函数,包一层出错函数处理异常。如果出错,返回出错的response,如果没出错,返回_get_response返回的东西
for mIDdleware_path in reversed(settings.MIDDLEWARE):
mIDdleware = import_string(mIDdleware_path)
try:
mw_instance = mIDdleware(handler)
except MIDdlewareNotUsed as exc:
if settings.DEBUG:
if str(exc):
logger.deBUG(‘MIDdlewareNotUsed(%r): %s‘,mIDdleware_path,exc)
else:
logger.deBUG(‘MIDdlewareNotUsed: %r‘,mIDdleware_path)
continue
if mw_instance is None:
raise ImproperlyConfigured(
‘MIDdleware factory %s returned None.‘ % mIDdleware_path
)
if hasattr(mw_instance,‘process_vIEw‘):
self._vIEw_mIDdleware.insert(0,mw_instance.process_vIEw)
if hasattr(mw_instance,‘process_template_response‘):
self._template_response_mIDdleware.append(mw_instance.process_template_response)
if hasattr(mw_instance,‘process_exception‘):
self._exception_mIDdleware.append(mw_instance.process_exception)
handler = convert_exception_to_response(mw_instance)
# We only assign to this when initialization is complete as it is used
# as a flag for initialization being complete.
self._mIDdleware_chain = handler
def _get_response(self,request): """ Resolve and call the vIEw,then apply vIEw,exception,and template_response mIDdleware. This method is everything that happens insIDe the request/response mIDdleware. """ response = None if hasattr(request,‘URLconf‘): URLconf = request.URLconf set_URLconf(URLconf) resolver = get_resolver(URLconf) else: resolver = get_resolver() resolver_match = resolver.resolve(request.path_info) #从请求url获取视图 callback,callback_args,callback_kwargs = resolver_match #获取视图函数,以及传参 request.resolver_match = resolver_match # Apply vIEw mIDdleware for mIDdleware_method in self._vIEw_mIDdleware: response = mIDdleware_method(request,callback,callback_kwargs) #在调用视图前调用vIEw中间件,注意,如果有返回response,将不调用视图函数 if response: break if response is None: wrapped_callback = self.make_vIEw_atomic(callback) #为每个视图封装一个事务 try: response = wrapped_callback(request,*callback_args,**callback_kwargs) #调用视图函数 except Exception as e: response = self.process_exception_by_mIDdleware(e,request) # Complain if the vIEw returned None (a common error). #调用视图之后返回response为空的异常处理 if response is None: if isinstance(callback,types.FunctionType): # FBV vIEw_name = callback.__name__ else: # CBV vIEw_name = callback.__class__.__name__ + ‘.__call__‘ raise ValueError( "The vIEw %s.%s dIDn‘t return an httpResponse object. It " "returned None instead." % (callback.__module__,vIEw_name) ) # If the response supports deferred rendering,apply template # response mIDdleware and then render the response elif hasattr(response,‘render‘) and callable(response.render): for mIDdleware_method in self._template_response_mIDdleware: response = mIDdleware_method(request,response) # Complain if the template response mIDdleware returned None (a common error). if response is None: raise ValueError( "%s.process_template_response dIDn‘t return an " "httpResponse object. It returned None instead." % (mIDdleware_method.__self__.__class__.__name__) ) try: response = response.render() except Exception as e: response = self.process_exception_by_mIDdleware(e,request) return response总结
以上是内存溢出为你收集整理的Django中间件初始化过程(草稿)全部内容,希望文章能够帮你解决Django中间件初始化过程(草稿)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)