
v^                 @   s   d  d l  Z  d  d l Z d  d l m Z d  d l m Z m Z d  d l m Z d  d l	 m
 Z
 m Z d  d l m Z m Z d  d l m Z d  d l m Z d	 d
 l m Z e  j d  Z Gd d   d  Z d d   Z e j e  d S)    N)settings)ImproperlyConfiguredMiddlewareNotUsed)request_finished)connectionstransaction)get_resolverset_urlconf)log_response)import_string   )convert_exception_to_responsezdjango.requestc               @   sd   e  Z d  Z d Z d Z d Z d Z d d   Z d d   Z d d   Z	 d d	   Z
 d
 d   Z d S)BaseHandlerNc             C   sd  g  |  _  g  |  _ g  |  _ t |  j  } x*t t j  D]} t |  } y | |  } Wnc t	 k
 r } zC t j
 r t |  r t j d | |  n t j d |  w: WYd d } ~ Xn X| d k r t d |   t | d  r|  j  j d | j  t | d  r%|  j j | j  t | d  rG|  j j | j  t |  } q: W| |  _ d S)	z
        Populate middleware lists from settings.MIDDLEWARE.

        Must be called after the environment is fixed (see __call__ in subclasses).
        zMiddlewareNotUsed(%r): %szMiddlewareNotUsed: %rNz$Middleware factory %s returned None.process_viewr   process_template_responseprocess_exception)_view_middleware_template_response_middleware_exception_middlewarer   _get_responsereversedr   Z
MIDDLEWAREr   r   DEBUGstrloggerdebugr   hasattrinsertr   appendr   r   _middleware_chain)selfhandlerZmiddleware_pathZ
middlewareZmw_instanceexc r"   ;/tmp/pip-build-8lau8j11/django/django/core/handlers/base.pyload_middleware   s2    				zBaseHandler.load_middlewarec             C   sg   t  | d t    } xK t j   D]= } | j d r" | j | k r" t j d | j  |  } q" W| S)NZ_non_atomic_requestsZATOMIC_REQUESTSZusing)getattrsetr   allZsettings_dictaliasr   Zatomic)r   viewZnon_atomic_requestsdbr"   r"   r#   make_view_atomic@   s
    zBaseHandler.make_view_atomicc             C   sd   t  t j  |  j |  } | j j | j  | j d k r` t d | j	 | j
 d | d | | S)z8Return an HttpResponse object for the given HttpRequest.i  z%s: %sresponserequest)r	   r   ZROOT_URLCONFr   Z_resource_closersr   closestatus_coder
   Zreason_phrasepath)r   r-   r,   r"   r"   r#   get_responseG   s    zBaseHandler.get_responsec             C   s  d } t  | d  r7 | j } t |  t |  } n	 t   } | j | j  } | \ } } } | | _ x- |  j D]" }	 |	 | | | |  } | rt Pqt W| d k r|  j |  }
 y |
 | | |  } Wn7 t	 k
 r} z |  j
 | |  } WYd d } ~ Xn X| d k r[t | t j  r/| j } n | j j d } t d | j | f   n t  | d  rt | j  rxE |  j D]: }	 |	 | |  } | d k rt d |	 j j j   qWy | j   } Wn7 t	 k
 r
} z |  j
 | |  } WYd d } ~ Xn X| S)z
        Resolve and call the view, then apply view, exception, and
        template_response middleware. This method is everything that happens
        inside the request/response middleware.
        Nurlconfz	.__call__zNThe view %s.%s didn't return an HttpResponse object. It returned None instead.renderz\%s.process_template_response didn't return an HttpResponse object. It returned None instead.)r   r2   r	   r   resolveZ	path_inforesolver_matchr   r+   	Exceptionprocess_exception_by_middleware
isinstancetypesFunctionType__name__	__class__
ValueError
__module__callabler3   r   __self__)r   r-   r,   r2   resolverr5   callbackcallback_argscallback_kwargsmiddleware_methodZwrapped_callbackeZ	view_namer"   r"   r#   r   U   sL    	
		%%zBaseHandler._get_responsec             C   s4   x* |  j  D] } | | |  } | r
 | Sq
 W  d S)z
        Pass the exception to the exception middleware. If no middleware
        return a response for this exception, raise it.
        N)r   )r   	exceptionr-   rE   r,   r"   r"   r#   r7      s
    z+BaseHandler.process_exception_by_middleware)r;   r>   __qualname__r   r   r   r   r$   r+   r1   r   r7   r"   r"   r"   r#   r      s   )@r   c             K   s   t  d  d S)z1Reset the URLconf after each request is finished.N)r	   )Zsenderkwargsr"   r"   r#   reset_urlconf   s    rJ   )loggingr9   Zdjango.confr   Zdjango.core.exceptionsr   r   Zdjango.core.signalsr   Z	django.dbr   r   Zdjango.urlsr   r	   Zdjango.utils.logr
   Zdjango.utils.module_loadingr   rG   r   	getLoggerr   r   rJ   connectr"   r"   r"   r#   <module>   s   