
    af9                         d dl Z d dlZd dlZd dlmZmZm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          Zd Z ej        e           dS )    N)async_to_synciscoroutinefunctionsync_to_async)settings)ImproperlyConfiguredMiddlewareNotUsed)request_finished)connectionstransaction)get_resolverset_urlconf)log_response)import_string   )convert_exception_to_responsezdjango.requestc                   f    e Zd ZdZdZdZdZddZ	 	 	 ddZd Z	d Z
d Zd Zd	 Zdd
Zd Zd ZdS )BaseHandlerNFc           	         g | _         g | _        g | _        |r| j        n| j        }t          |          }|}t          t          j                  D ]}t          |          }t          |dd          }t          |dd          }|s|st          d|z            |s|rd}	n|}		 |                     |	||t          j        d|z            }
 ||
          }|
}nj# t          $ r]}t          j        rGt          |          rt                               d||           nt                               d	|           Y d
}~d
}~ww xY w|t%          d|z            t'          |d          r4| j                             d|                     ||j                             t'          |d          r3| j                            |                     ||j                             t'          |d          r3| j                            |                     d|j                             t          |          }|	}|                     |||          }|| _        d
S )z
        Populate middleware lists from settings.MIDDLEWARE.

        Must be called after the environment is fixed (see __call__ in subclasses).
        sync_capableTasync_capableFzOMiddleware %s must have at least one of sync_capable/async_capable set to True.zmiddleware %s)debugnamezMiddlewareNotUsed(%r): %szMiddlewareNotUsed: %rNz$Middleware factory %s returned None.process_viewr   process_template_responseprocess_exception)_view_middleware_template_response_middleware_exception_middleware_get_response_async_get_responser   reversedr   
MIDDLEWAREr   getattrRuntimeErroradapt_method_modeDEBUGr   strloggerr   r   hasattrinsertr   appendr   r   _middleware_chain)selfis_asyncget_responsehandlerhandler_is_asyncmiddleware_path
middlewaremiddleware_can_syncmiddleware_can_asyncmiddleware_is_asyncadapted_handlermw_instanceexcs                K/var/www/html/env/lib/python3.11/site-packages/django/core/handlers/base.pyload_middlewarezBaseHandler.load_middleware   s    !#-/*%'"3;St//AS/==#'(;<< 9	3 9	3O&77J")*nd"K"K#*:#N#N & ;/C ;">@OP   & ;*= ;&+##&:#*"&"8"8'$".(?: #9 # # )j99 * %   > O3xx O%@/SVWWWW%<oNNN "*:_L   {N33 %,,**8[5MNN   {$?@@ 299** +"G   
 {$788  *11**5+2OPP   4K@@G2 ((7<LMM ")s   $2C
E #AD;;E c                 
   |t          |          }|r|s|p	d|j        z  }|r1|s.|rt                              d|           t	          |d          S n.|r,|rt                              d|           t          |          S |S )a\  
        Adapt a method to be in the correct "mode":
        - If is_async is False:
          - Synchronous methods are left alone
          - Asynchronous methods are wrapped with async_to_sync
        - If is_async is True:
          - Synchronous methods are wrapped with sync_to_async()
          - Asynchronous methods are left alone
        Nzmethod %s()z#Synchronous handler adapted for %s.Tthread_sensitivez$Asynchronous handler adapted for %s.)r   __qualname__r(   r   r   r   )r-   r.   methodmethod_is_asyncr   r   s         r:   r%   zBaseHandler.adapt_method_modeh   s    " "1&99O 	? 	?>=6+>>D 	)" D NLL!FMMM$VdCCCCD  	) KCTJJJ (((    c                     t          t          j                   |                     |          }|j                            |j                   |j        dk    rt          d|j	        |j
        ||           |S )z8Return an HttpResponse object for the given HttpRequest.  %s: %sresponserequest)r   r   ROOT_URLCONFr,   _resource_closersr+   closestatus_coder   reason_phrasepathr-   rH   rG   s      r:   r/   zBaseHandler.get_response   s     	H)***))'22"))'-8883&&&!    rB   c                 .  K   t          t          j                   |                     |           d{V }|j                            |j                   |j        dk    r4 t          t          d          d|j
        |j        ||           d{V  |S )z
        Asynchronous version of get_response.

        Funneling everything, including WSGI, into a single async
        get_response() is too slow. Avoid the context switch by using
        a separate async response path.
        NrD   Fr=   rE   rF   )r   r   rI   r,   rJ   r+   rK   rL   r   r   rM   rN   rO   s      r:   get_response_asynczBaseHandler.get_response_async   s       	H)***//88888888"))'-8883&&E-uEEE&!          rB   c                    d}|                      |          \  }}}| j        D ]} |||||          }|r n|q|                     |          }t          |          rt	          |          }	  ||g|R i |}n0# t
          $ r#}|                     ||          }| Y d}~nd}~ww xY w|                     ||           t          |d          rt          |j
                  r| j        D ]8} |||          }|                     |||j        j        j        d           9	 |
                                }n0# t
          $ r#}|                     ||          }| Y d}~nd}~ww xY w|S )
        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render.process_template_responser   )resolve_requestr   make_view_atomicr   r   	Exceptionprocess_exception_by_middlewarecheck_responser)   callablerT   r   __self__	__class____name__	r-   rH   rG   callbackcallback_argscallback_kwargsmiddleware_methodwrapped_callbackes	            r:   r    zBaseHandler._get_response   s(    373G3G3P3P0- "&!6 	 	((=/ H   #44X>>"#344 C#01A#B#B ++GWmWWWWW   ??7KK# $#### 	Hh/// 8X&& 	8HO+D+D 	%)%G 	 	!,,Wh?? ##%(1;DDDG $    #??,,   ??7KK# $####
 s0   .A; ;
B(B##B(&D; ;
E(E##E(c                 
  K   d}|                      |          \  }}}| j        D ]} |||||           d{V }|r n||                     |          }t          |          st	          |d          }	  ||g|R i | d{V }n@# t
          $ r3} t	          | j        d          ||           d{V }| Y d}~nd}~ww xY w|                     ||           t          |d          rt          |j
                  r| j        D ]>} |||           d{V }|                     |||j        j        j        d           ?	 t          |j
                  r|
                                 d{V }n$ t	          |j
        d                       d{V }n@# t
          $ r3} t	          | j        d          ||           d{V }| Y d}~nd}~ww xY wt          j        |          rt#          d          |S )rS   NTr=   rT   rU   rV   zResponse is still a coroutine.)rW   r   rX   r   r   rY   rZ   r[   r)   r\   rT   r   r]   r^   r_   asyncioiscoroutiner$   r`   s	            r:   r   zBaseHandler._get_response_async   s      373G3G3P3P0- "&!6 	 	..=/       H   #44X>>&'788 #0$t$ $ $ 
!1!1"+" " "/>" "          "8%)" " " W" "       # $#### 	Hh/// 8X&& 	8HO+D+D 	%)%G 	 	!!2!27H!E!EEEEEEE ##%(1;DDDG $    &x77 %-__%6%6666666HH&] $& & & & &            H    "8%)" " " W" "       # $#### x(( 	A?@@@s1   8B 
C)CCAF   
G*)GGc                     t          |d          r&|j        }t          |           t          |          }nt                      }|                    |j                  }||_        |S )zw
        Retrieve/set the urlconf for the request. Return the view resolved,
        with its args and kwargs.
        urlconf)r)   rk   r   r   resolve	path_inforesolver_match)r-   rH   rk   resolverrn   s        r:   rW   zBaseHandler.resolve_request,  sg     7I&& 	&oG   #G,,HH#~~H!))'*;<<!/rB   c                 8   |t          j        |          sdS |sEt          |t          j                  rd|j        d|j        }nd|j        d|j        j        d}|t          d|z            t          j        |          rt          d|z            dS )zT
        Raise an error if the view returned None or an uncalled coroutine.
        Nz	The view .z	.__call__zB%s didn't return an HttpResponse object. It returned None instead.z%s didn't return an HttpResponse object. It returned an unawaited coroutine instead. You may need to add an 'await' into your view.)	rh   ri   
isinstancetypesFunctionType
__module__r_   r^   
ValueError)r-   rG   ra   r   s       r:   r[   zBaseHandler.check_response=  s      G$7$A$A F 	(E$677  +3+>+>+>@Q@QR '''&/// !"    ** 	"$()  	 	rB   c                    t          |dt                                }t          j                                        D ]M\  }}|d         r@||vr<t          |          rt          d           t          j        |          |          }N|S )N_non_atomic_requestsATOMIC_REQUESTSz0You cannot use ATOMIC_REQUESTS with async views.)using)	r#   setr
   r   itemsr   r$   r   atomic)r-   viewnon_atomic_requestsaliassettings_dicts        r:   rX   zBaseHandler.make_view_atomicY  s    %d,BCEEJJ$/$8$>$>$@$@ 	= 	= E=./ =EAT4T4T&t,, &J   7{)666t<<rB   c                 >    | j         D ]} |||          }|r|c S dS )z
        Pass the exception to the exception middleware. If no middleware
        return a response for this exception, return None.
        N)r   )r-   	exceptionrH   rd   rG   s        r:   rZ   z+BaseHandler.process_exception_by_middlewared  sD    
 "&!; 	  	 (()<<H   trB   )F)NFN)N)r_   ru   r?   r   r   r   r,   r;   r%   r/   rQ   r    r   rW   r[   rX   rZ    rB   r:   r   r      s        $(! L) L) L) L)d    @     ,4 4 4lF F FP  "   8	 	 		 	 	 	 	rB   r   c                 $    t          d           dS )z1Reset the URLconf after each request is finished.N)r   )senderkwargss     r:   reset_urlconfr   p  s    rB   )rh   loggingrs   asgiref.syncr   r   r   django.confr   django.core.exceptionsr   r   django.core.signalsr	   	django.dbr
   r   django.urlsr   r   django.utils.logr   django.utils.module_loadingr   r   r   	getLoggerr(   r   r   connectr   rB   r:   <module>r      sO      J J J J J J J J J J             J J J J J J J J 0 0 0 0 0 0 . . . . . . . . 1 1 1 1 1 1 1 1 ) ) ) ) ) ) 5 5 5 5 5 5 4 4 4 4 4 4		+	,	,Y Y Y Y Y Y Y Yx
  
    ' ' ' ' 'rB   