o
    ˜¨Êhð9  ã                   @   sÂ   d dl Z d dlZd dl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 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Úsync_to_async)Úsettings)ÚImproperlyConfiguredÚMiddlewareNotUsed)Úrequest_finished)ÚconnectionsÚtransaction)Úget_resolverÚset_urlconf)Úlog_response)Úimport_stringé   )Úconvert_exception_to_responsezdjango.requestc                   @   sx   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ƒ}|s8|s8td| ƒ‚|s?|r?d}	n|}	z| j|	||tjd| d�}
||
ƒ}W n' ty{ } ztjrqt|ƒrkt d||¡ nt d	|¡ W Y d
}~qd
}~ww |
}|d
u rˆtd| ƒ‚t|dƒr™| j  d|  ||j¡¡ t|dƒr©| j |  ||j¡¡ t|dƒr¹| j |  d|j¡¡ t|ƒ}|	}q|  |||¡}|| _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Úexc© r6   úK/var/www/html/env/lib/python3.10/site-packages/django/core/handlers/base.pyÚload_middleware   sx   ÿÿû€úÿ
þ
ÿÿ
ÿ
zBaseHandler.load_middlewarec                 C   sp   |du r	t  |¡}|r|s|pd|j }|r(|s&|r t d|¡ t|dd�S |S |r6|r2t 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.)ÚasyncioÚiscoroutinefunctionÚ__qualname__r$   r   r   r   )r)   r*   ÚmethodÚmethod_is_asyncr   r   r6   r6   r7   r!   h   s   
üzBaseHandler.adapt_method_modec                 C   sF   t tjƒ |  |¡}|j |j¡ |jdkr!t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)   rD   rC   r6   r6   r7   r+   ˆ   s   


ûzBaseHandler.get_responsec                 Ã   s\   �t tjƒ |  |¡I dH }|j |j¡ |jdkr,t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.
        Nr@   Fr9   rA   rB   )r   r   rE   r(   rF   r'   rG   rH   r   r   rI   rJ   rK   r6   r6   r7   Úget_response_async˜   s   €
	

ûzBaseHandler.get_response_asyncc           	   
   C   sR  d}|   |¡\}}}| jD ]}|||||ƒ}|r nq|du rX|  |¡}t |¡r-t|ƒ}z||g|¢R i |¤Ž}W n tyW } z|  ||¡}|du rM‚ W Y d}~nd}~ww |  ||¡ t	|dƒr§t
|jƒr§| jD ]}|||ƒ}| j||d|jjjf d� qkz| ¡ }W |S  ty¦ } z|  ||¡}|du r›‚ W Y d}~|S d}~w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ú%s.process_template_response©r   )Úresolve_requestr   Úmake_view_atomicr;   r<   r   Ú	ExceptionÚprocess_exception_by_middlewareÚcheck_responser%   ÚcallablerN   r   Ú__self__Ú	__class__Ú__name__©	r)   rD   rC   ÚcallbackÚcallback_argsÚcallback_kwargsÚmiddleware_methodÚwrapped_callbackÚer6   r6   r7   r   ®   sZ   
ÿÿ

ÿ€þ


ÿý
û
ÿ€ûzBaseHandler._get_responsec           	   
   Ã   s¾  �d}|   |¡\}}}| jD ]}|||||ƒI dH }|r nq|du rh|  |¡}t |¡s3t|dd�}z||g|¢R i |¤ŽI dH }W n$ tyg } zt| jdd�||ƒI dH }|du r]‚ W Y d}~nd}~ww |  ||¡ t	|dƒrÔt
|jƒrÔ| jD ]}|||ƒI dH }| j||d|jjjf d� q{zt |j¡r£| ¡ I dH }nt|jdd�ƒ I dH }W n$ tyÓ } zt| jdd�||ƒI dH }|du rÉ‚ W Y d}~nd}~ww t |¡rÝtdƒ‚|S )rM   NTr9   rN   rO   rP   zResponse is still a coroutine.)rQ   r   rR   r;   r<   r   rS   rT   rU   r%   rV   rN   r   rW   rX   rY   Úiscoroutiner    rZ   r6   r6   r7   r   ä   sŠ   €

ÿÿ

ÿÿÿÿþ
ýÿ€û	

ÿýÿ€þ
ýÿ€û
	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%   rb   r   r
   ÚresolveÚ	path_infoÚresolver_match)r)   rD   rb   Úresolverre   r6   r6   r7   rQ   ,  s   

zBaseHandler.resolve_requestc                 C   sx   |du st  |¡sdS |s%t|tjƒrd|j|jf }n	d|j|jjf }|du r/td| ƒ‚t  |¡r:t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.)	r;   ra   Ú
isinstanceÚtypesÚFunctionTypeÚ
__module__rY   rX   Ú
ValueError)r)   rC   r[   r   r6   r6   r7   rU   =  s,   þÿÿ
þÿÿzBaseHandler.check_responsec                 C   sX   t |dtƒ ƒ}tj ¡ D ]\}}|d r)||vr)t |¡r!tdƒ‚tj	|d�|ƒ}q|S )NÚ_non_atomic_requestsÚATOMIC_REQUESTSz0You cannot use ATOMIC_REQUESTS with async views.)Úusing)
r   Úsetr   r   Úitemsr;   r<   r    r	   Úatomic)r)   ÚviewÚnon_atomic_requestsÚaliasÚsettings_dictr6   r6   r7   rR   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)   Ú	exceptionrD   r^   rC   r6   r6   r7   rT   d  s   

ÿz+BaseHandler.process_exception_by_middleware)F)NFN)N)rY   rj   r=   r   r   r   r(   r8   r!   r+   rL   r   r   rQ   rU   rR   rT   r6   r6   r6   r7   r      s$    
R
ú 6H
r   c                 K   s   t dƒ dS )z1Reset the URLconf after each request is finished.N)r   )ÚsenderÚkwargsr6   r6   r7   Úreset_urlconfp  s   ry   )r;   Úloggingrh   Úasgiref.syncr   r   Údjango.confr   Údjango.core.exceptionsr   r   Údjango.core.signalsr   Ú	django.dbr   r	   Údjango.urlsr
   r   Údjango.utils.logr   Údjango.utils.module_loadingr   rv   r   Ú	getLoggerr$   r   ry   Úconnectr6   r6   r6   r7   Ú<module>   s$    
  ^