a
    LcòfÝ9  ã                   @   sÆ   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 d¡ZG dd„ dƒZdd„ Ze 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                   @   sr   e Zd ZdZdZdZdZddd„Zddd„Zdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ Zddd„Zdd„ Zdd„ ZdS )ÚBaseHandlerNFc                 C   s²  g | _ g | _g | _|r| jn| j}t|ƒ}|}ttjƒD �]^}t	|ƒ}t
|ddƒ}t
|ddƒ}|st|sttd| ƒ‚n|s‚|r‚d}	n|}	z&| j|	||tjd| d�}
||
ƒ}W n\ t�y } zBtjrèt|ƒrÜt d||¡ nt d	|¡ W Y d
}~q8W Y d
}~nd
}~0 0 |
}|d
u �r$td| ƒ‚t|dƒ�rH| j  d|  ||j¡¡ t|dƒ�rj| j |  ||j¡¡ t|dƒ�rŒ| j |  d|j¡¡ t|ƒ}|	}q8|  |||¡}|| _d
S )zš
        Populate middleware lists from settings.MIDDLEWARE.

        Must be called after the environment is fixed (see __call__ in subclasses).
        Zsync_capableTZ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   Z
MIDDLEWAREr   ÚgetattrÚRuntimeErrorÚadapt_method_modeÚDEBUGr   ÚstrÚloggerr   r   ÚhasattrÚinsertr   Úappendr   r   Ú_middleware_chain)ÚselfÚis_asyncÚget_responseÚhandlerZhandler_is_asyncZmiddleware_pathZ
middlewareZmiddleware_can_syncZmiddleware_can_asyncZmiddleware_is_asyncZadapted_handlerZmw_instanceÚexc© r,   úV/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/core/handlers/base.pyÚload_middleware   st    ÿÿû"
ÿþÿÿÿzBaseHandler.load_middlewarec                 C   sl   |du rt |ƒ}|r&|s&|p$d|j }|rL|sh|r>t d|¡ t|dd�S n|rh|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©Zthread_sensitivez$Asynchronous handler adapted for %s.)r   Ú__qualname__r"   r   r   r   )r'   r(   ÚmethodZmethod_is_asyncr   r   r,   r,   r-   r   h   s    zBaseHandler.adapt_method_modec                 C   sF   t tjƒ |  |¡}|j |j¡ |jdkrBtd|j	|j
||d� |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'   r6   r5   r,   r,   r-   r)   ˆ   s    


ûzBaseHandler.get_responsec                 Ã   sZ   t tjƒ |  |¡I dH }|j |j¡ |jdkrVtt	dd�d|j
|j||d�I dH  |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.
        Nr2   Fr/   r3   r4   )r   r   r7   r&   r8   r%   r9   r:   r   r   r;   r<   r=   r,   r,   r-   Úget_response_async˜   s    	


ûzBaseHandler.get_response_asyncc           	   
   C   sT  d}|   |¡\}}}| jD ]}|||||ƒ}|r q6q|du r®|  |¡}t|ƒrXt|ƒ}z||g|¢R i |¤Ž}W n: ty¬ } z"|  ||¡}|du r˜‚ W Y d}~n
d}~0 0 |  ||¡ t|dƒ�rPt	|j
ƒ�rP| jD ]*}|||ƒ}| j||d|jjjf d� qØz| 
¡ }W n> t�yN } z$|  ||¡}|du �r:‚ W Y d}~n
d}~0 0 |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ú%s.process_template_response©r   )Úresolve_requestr   Úmake_view_atomicr   r   Ú	ExceptionÚprocess_exception_by_middlewareÚcheck_responser#   Úcallabler@   r   Ú__self__Ú	__class__Ú__name__©	r'   r6   r5   ÚcallbackÚcallback_argsÚcallback_kwargsÚmiddleware_methodZwrapped_callbackÚer,   r,   r-   r   ®   sH    
ÿ



ÿý
zBaseHandler._get_responsec           	   
   Ã   sÄ  d}|   |¡\}}}| jD ] }|||||ƒI dH }|r q<q|du rÌ|  |¡}t|ƒsbt|dd�}z ||g|¢R i |¤ŽI dH }W nH tyÊ } z0t| jdd�||ƒI dH }|du r¶‚ W Y d}~n
d}~0 0 |  ||¡ t|dƒ�r¬t	|j
ƒ�r¬| jD ]0}|||ƒI dH }| j||d|jjjf d� qöz6t|j
ƒ�rF| 
¡ I dH }nt|j
dd�ƒ I dH }W nL t�yª } z2t| jdd�||ƒI dH }|du �r–‚ W Y d}~n
d}~0 0 t |¡�rÀtdƒ‚|S )r?   NTr/   r@   rA   rB   zResponse is still a coroutine.)rC   r   rD   r   r   rE   rF   rG   r#   rH   r@   r   rI   rJ   rK   ÚasyncioÚiscoroutiner   rL   r,   r,   r-   r   ä   sx    
ÿ

ÿÿÿÿþý


ÿýÿþý

zBaseHandler._get_response_asyncc                 C   s>   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#   rT   r   r   ÚresolveZ	path_infoÚresolver_match)r'   r6   rT   ÚresolverrV   r,   r,   r-   rC   ,  s    

zBaseHandler.resolve_requestc                 C   sz   |du st  |¡sdS |sJt|tjƒr8d|j|jf }nd|j|jjf }|du r`td| ƒ‚nt  |¡rvtd| ƒ‚dS )zT
        Raise an error if the view returned None or an uncalled coroutine.
        NzThe view %s.%szThe view %s.%s.__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.)	rR   rS   Ú
isinstanceÚtypesÚFunctionTypeÚ
__module__rK   rJ   Ú
ValueError)r'   r5   rM   r   r,   r,   r-   rG   =  s*    þÿÿ
þÿzBaseHandler.check_responsec                 C   sV   t |dtƒ ƒ}tj ¡ D ]8\}}|d r||vrt|ƒr@tdƒ‚tj|d�|ƒ}q|S )NZ_non_atomic_requestsZATOMIC_REQUESTSz0You cannot use ATOMIC_REQUESTS with async views.)Úusing)	r   Úsetr	   r   Úitemsr   r   r
   Zatomic)r'   ÚviewZnon_atomic_requestsÚaliasZsettings_dictr,   r,   r-   rD   Y  s    ÿzBaseHandler.make_view_atomicc                 C   s&   | j D ]}|||ƒ}|r|  S qdS )z�
        Pass the exception to the exception middleware. If no middleware
        return a response for this exception, return None.
        N)r   )r'   Ú	exceptionr6   rP   r5   r,   r,   r-   rF   d  s
    


z+BaseHandler.process_exception_by_middleware)F)NFN)N)rK   r[   r0   r   r   r   r&   r.   r   r)   r>   r   r   rC   rG   rD   rF   r,   r,   r,   r-   r      s"   
R   ú
 6H
r   c                 K   s   t dƒ dS )z1Reset the URLconf after each request is finished.N)r   )ZsenderÚkwargsr,   r,   r-   Úreset_urlconfp  s    rd   )rR   ÚloggingrY   Zasgiref.syncr   r   r   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   rb   r   Ú	getLoggerr"   r   rd   Úconnectr,   r,   r,   r-   Ú<module>   s"   
  ^