a
    ¥Q•hÝ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).
        Ú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ÚhandlerZhandler_is_asyncZmiddleware_pathZ
middlewareZmiddleware_can_syncZmiddleware_can_asyncZmiddleware_is_asyncZadapted_handlerZmw_instanceÚexc© r/   úR/var/www/sistema_ama/venv/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©Úthread_sensitivez$Asynchronous handler adapted for %s.)r   Ú__qualname__r%   r   r   r   )r*   r+   ÚmethodZmethod_is_asyncr   r   r/   r/   r0   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*   r:   r9   r/   r/   r0   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.
        Nr6   Fr2   r7   r8   )r   r   r;   r)   r<   r(   r=   r>   r   r   r?   r@   rA   r/   r/   r0   Ú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&   ÚcallablerD   r   Ú__self__Ú	__class__Ú__name__©	r*   r:   r9   ÚcallbackZcallback_argsZcallback_kwargsÚmiddleware_methodZwrapped_callbackÚer/   r/   r0   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 )rC   NTr2   rD   rE   rF   zResponse is still a coroutine.)rG   r   rH   r   r   rI   rJ   rK   r&   rL   rD   r   rM   rN   rO   ÚasyncioÚiscoroutiner!   rP   r/   r/   r0   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&   rV   r   r   ÚresolveÚ	path_infoÚresolver_match)r*   r:   rV   ZresolverrY   r/   r/   r0   rG   ,  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.)	rT   rU   Ú
isinstanceÚtypesÚFunctionTypeÚ
__module__rO   rN   Ú
ValueError)r*   r9   rQ   r   r/   r/   r0   rK   =  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.)Zusing)	r    Úsetr	   r   Úitemsr   r!   r
   Zatomic)r*   ÚviewZnon_atomic_requestsÚaliasZsettings_dictr/   r/   r0   rH   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*   Ú	exceptionr:   rR   r9   r/   r/   r0   rJ   d  s
    


z+BaseHandler.process_exception_by_middleware)F)NFN)N)rO   r]   r4   r   r   r   r)   r1   r"   r,   rB   r   r   rG   rK   rH   rJ   r/   r/   r/   r0   r      s"   
R   ú
 6H
r   c                 K   s   t dƒ dS )z1Reset the URLconf after each request is finished.N)r   )ÚsenderÚkwargsr/   r/   r0   Úreset_urlconfp  s    rf   )rT   Úloggingr[   Úasgiref.syncr   r   r   Údjango.confr   Údjango.core.exceptionsr   r   Zdjango.core.signalsr   Z	django.dbr	   r
   Údjango.urlsr   r   Údjango.utils.logr   Zdjango.utils.module_loadingr   rc   r   Ú	getLoggerr%   r   rf   Úconnectr/   r/   r/   r0   Ú<module>   s"   
  ^