ó
ø¢TQc           @  sÿ   d  d l  m Z d  d l Z d  d l Z d  d l Z d  d l m Z d  d l m Z d  d l	 m
 Z
 d  d l	 m Z d  d l	 m Z d  d l m Z d  d	 l m Z d  d
 l m Z d  d l m Z e j d ƒ Z d e f d „  ƒ  YZ d „  Z d „  Z d S(   iÿÿÿÿ(   t   unicode_literalsN(   t   http(   t   settings(   t
   exceptions(   t   urlresolvers(   t   signals(   t
   force_text(   t   import_module(   t   six(   t   debugu   django.requestt   BaseHandlerc           B  sS   e  Z e j e j e j e j g Z d  „  Z d „  Z	 d „  Z
 d „  Z d „  Z RS(   c         C  s)   d  |  _ |  _ |  _ |  _ |  _ d  S(   N(   t   Nonet   _request_middlewaret   _view_middlewaret   _template_response_middlewaret   _response_middlewaret   _exception_middleware(   t   self(    (    s2   ../Django//lib/python/django/core/handlers/base.pyt   __init__   s    c   	      C  só  g  |  _  g  |  _ g  |  _ g  |  _ g  } x¹t j D]®} y | j d d ƒ \ } } Wn$ t k
 r| t j	 d | ƒ ‚ n Xy t
 | ƒ } Wn, t k
 r» } t j	 d | | f ƒ ‚ n Xy t | | ƒ } Wn* t k
 rû t j	 d | | f ƒ ‚ n Xy | ƒ  } Wn t j k
 r"q4 n Xt | d ƒ rE| j | j ƒ n  t | d ƒ rj|  j  j | j ƒ n  t | d ƒ r’|  j j d	 | j ƒ n  t | d
 ƒ rº|  j j d	 | j ƒ n  t | d ƒ r4 |  j j d	 | j ƒ q4 q4 W| |  _ d S(   u¢   
        Populate middleware lists from settings.MIDDLEWARE_CLASSES.

        Must be called after the environment is fixed (see __call__ in subclasses).
        u   .i   u   %s isn't a middleware moduleu#   Error importing middleware %s: "%s"u3   Middleware module "%s" does not define a "%s" classu   process_requestu   process_viewu   process_template_responsei    u   process_responseu   process_exceptionN(   R   R   R   R   R   t   MIDDLEWARE_CLASSESt   rsplitt
   ValueErrorR   t   ImproperlyConfiguredR   t   ImportErrort   getattrt   AttributeErrort   MiddlewareNotUsedt   hasattrt   appendt   process_requestt   process_viewt   insertt   process_template_responset   process_responset   process_exceptionR   (	   R   t   request_middlewaret   middleware_patht	   mw_modulet   mw_classnamet   modt   et   mw_classt   mw_instance(    (    s2   ../Django//lib/python/django/core/handlers/base.pyt   load_middleware!   sB    				c         C  si  zÚt  j } t j | ƒ t j d | ƒ } yúd } x' |  j D] } | | ƒ } | r> Pq> q> W| d k rt | d ƒ r¤ | j } t j | ƒ t j d | ƒ } n  | j	 | j
 ƒ } | \ } } }	 | | _ x3 |  j D]% } | | | | |	 ƒ } | rØ PqØ qØ Wn  | d k r~y | | | |	 Ž } Wq~t k
 rz}
 x* |  j D] } | | |
 ƒ } | rBPqBqBW| d k r{‚  q{q~Xn  | d k rÔt | t j ƒ r¨| j } n | j j d } t d | j | f ƒ ‚ n  t | d ƒ r$t | j ƒ r$x  |  j D] } | | | ƒ } qüW| j ƒ  } n  Wn±t j k
 rè}
 t j d | j d i d d	 6| d
 6ƒt  j rt j  | |
 ƒ } qÙy% | j! ƒ  \ } } | | |  } WqÙt" j# j$ d |  j d | ƒ |  j% | | t& j' ƒ  ƒ } qÙXnñ t( j) k
 rˆt j d | j d i d d	 6| d
 6ƒy% | j* ƒ  \ } } | | |  } WqÙt" j# j$ d |  j d | ƒ |  j% | | t& j' ƒ  ƒ } qÙXnQ t+ k
 r›‚  n> t" j# j$ d |  j d | ƒ |  j% | | t& j' ƒ  ƒ } n XWd t j d ƒ Xy9 x  |  j, D] } | | | ƒ } qøW|  j- | | ƒ } Wn> t" j# j$ d |  j d | ƒ |  j% | | t& j' ƒ  ƒ } n X| S(   u8   Returns an HttpResponse object for the given HttpRequestu   ^/u   urlconfu	   .__call__u4   The view %s.%s didn't return an HttpResponse object.u   renderu   Not Found: %st   extrai”  u   status_codeu   requestt   sendert   requestu!   Forbidden (Permission denied): %si“  N(.   R   t   ROOT_URLCONFR   t   set_urlconft   RegexURLResolverR   R   R   t   urlconft   resolvet	   path_infot   resolver_matchR   t	   ExceptionR   t
   isinstancet   typest   FunctionTypet   __name__t	   __class__R   t
   __module__t   callablet   renderR   R   t   Http404t   loggert   warningt   patht   DEBUGR	   t   technical_404_responset
   resolve404R   t   got_request_exceptiont   sendt   handle_uncaught_exceptiont   syst   exc_infoR   t   PermissionDeniedt
   resolve403t
   SystemExitR   t   apply_response_fixes(   R   R.   R2   t   resolvert   responset   middleware_methodR5   t   callbackt   callback_argst   callback_kwargsR(   t	   view_namet
   param_dict(    (    s2   ../Django//lib/python/django/core/handlers/base.pyt   get_responseN   s¤    				"	#c      	   C  s“   t  j r ‚  n  t j d | j d | d i d d 6| d 6ƒt  j rU t j | | Œ S| j d k rt t
 j | Œ  n  | j ƒ  \ } } | | |  S(   u  
        Processing for any otherwise uncaught exceptions (those that will
        generate HTTP 500 responses). Can be overridden by subclasses who want
        customised 500 handling.

        Be *very* careful when overriding this because the error could be
        caused by anything, so assuming something like the database is always
        available would be an error.
        u   Internal Server Error: %sRJ   R,   iô  u   status_codeu   requestN(   R   t   DEBUG_PROPAGATE_EXCEPTIONSR@   t   errorRB   RC   R	   t   technical_500_responset   urlconf_moduleR   R   t   reraiset
   resolve500(   R   R.   RO   RJ   RR   RV   (    (    s2   ../Django//lib/python/django/core/handlers/base.pyRH   Ã   s    
		c         C  s'   x  |  j  D] } | | | ƒ } q
 W| S(   u´   
        Applies each of the functions in self.response_fixes to the request and
        response, modifying the response in the process. Returns the new
        response.
        (   t   response_fixes(   R   R.   RP   t   func(    (    s2   ../Django//lib/python/django/core/handlers/base.pyRN   â   s    (   R:   R<   R   t   fix_location_headert   conditional_content_removalt   fix_IE_for_attacht   fix_IE_for_varyR^   R   R+   RW   RH   RN   (    (    (    s2   ../Django//lib/python/django/core/handlers/base.pyR
      s   		-	u	c         C  s@   |  j  d t d ƒ ƒ } t j r3 | j d ƒ } n  | j d ƒ S(   uC   
    Returns the HTTP request's PATH_INFO as a unicode string.
    u	   PATH_INFOu   /u
   iso-8859-1u   utf-8(   t   gett   strR   t   PY3t   encodet   decode(   t   environR4   (    (    s2   ../Django//lib/python/django/core/handlers/base.pyt   get_path_infoí   s    	c         C  s¬   t  j d k	 r t t  j ƒ S|  j d |  j d t d ƒ ƒ ƒ } | rl | t |  j d t d ƒ ƒ ƒ  } n |  j d t d ƒ ƒ } t j rŸ | j	 d ƒ } n  | j
 d ƒ S(	   uM  
    Returns the equivalent of the HTTP request's SCRIPT_NAME environment
    variable. If Apache mod_rewrite has been used, returns what would have been
    the script name prior to any rewriting (so it's the script name as seen
    from the client's perspective), unless the FORCE_SCRIPT_NAME setting is
    set (to anything).
    u
   SCRIPT_URLu   REDIRECT_URLu    u	   PATH_INFOu   SCRIPT_NAMEu
   iso-8859-1u   utf-8N(   R   t   FORCE_SCRIPT_NAMER   R   Rd   Re   t   lenR   Rf   Rg   Rh   (   Ri   t
   script_urlt   script_name(    (    s2   ../Django//lib/python/django/core/handlers/base.pyt   get_script_nameú   s    $&	(   t
   __future__R    t   loggingRI   R8   t   djangoR   t   django.confR   t   django.coreR   R   R   t   django.utils.encodingR   t   django.utils.importlibR   t   django.utilsR   t   django.viewsR	   t	   getLoggerR@   t   objectR
   Rj   Ro   (    (    (    s2   ../Django//lib/python/django/core/handlers/base.pyt   <module>   s    Ù	