3
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G d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   s  g | _ g | _g | _t| j}xttjD ]}t|}y||}W nN t	k
r } z2tj
r|t|rptjd|| ntjd| w(W Y dd}~X nX |dkrtd| t|dr| j jd|j t|dr| jj|j t|dr| 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   
MIDDLEWAREr   r   DEBUGstrloggerdebugr   hasattrinsertr   appendr   r   _middleware_chain)selfhandlerZmiddleware_pathZ
middlewareZmw_instanceexc r#   =/usr/lib/python3.6/site-packages/django/core/handlers/base.pyload_middleware   s2    




zBaseHandler.load_middlewarec             C   sJ   t |dt }x6tj D ]*}|jd r|j|krtj|jd|}qW |S )NZ_non_atomic_requestsATOMIC_REQUESTS)Z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   sF   t tj | j|}|jj|j |jdkrBtd|j	|j
||d |S )z8Return an HttpResponse object for the given HttpRequest.i  z%s: %s)responserequest)r	   r   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r&|j}t| t|}nt }|j|j}|\}}}||_x"| jD ]}	|	||||}|rPP qPW |dkr| j|}
y|
|f||}W n. t	k
r } z| j
||}W Y dd}~X nX |dkrt|tjr|j}n|jjd }td|j|f nt |drt|jrx6| jD ],}	|	||}|dkrtd|	jjj qW y|j }W n0 t	k
r } z| j
||}W Y dd}~X n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   r5   r	   r   resolve	path_inforesolver_matchr   r-   	Exceptionprocess_exception_by_middleware
isinstancetypesFunctionType__name__	__class__
ValueError
__module__callabler6   r   __self__)r    r/   r.   r5   resolverr9   callbackZcallback_argsZcallback_kwargsmiddleware_methodZwrapped_callbackeZ	view_namer#   r#   r$   r   U   sL    





zBaseHandler._get_responsec             C   s(   x | j D ]}|||}|r|S q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/   rG   r.   r#   r#   r$   r;      s
    
z+BaseHandler.process_exception_by_middleware)r?   rB   __qualname__r   r   r   r   r%   r-   r4   r   r;   r#   r#   r#   r$   r      s   )@r   c             K   s   t d dS )z1Reset the URLconf after each request is finished.N)r	   )senderkwargsr#   r#   r$   reset_urlconf   s    rM   )loggingr=   django.confr   django.core.exceptionsr   r   django.core.signalsr   	django.dbr   r   django.urlsr   r	   django.utils.logr
   django.utils.module_loadingr   rI   r   	getLoggerr   r   rM   connectr#   r#   r#   r$   <module>   s   
 