3
¥Yði<  ã            	   @   sz   d dl ZddlmZ ddlmZ ddl mZ edddd	d
dddgƒZG dd„ dƒZG dd„ de	ƒZ
G dd„ dee
d�ZdS )é    Né   )Úcurrent_app)Úrequest)ÚResponseReturnValueÚgetÚpostÚheadÚoptionsÚdeleteÚputÚtraceÚpatchc               @   sp   e Zd ZU dZdZejeje  dZ	eje
 	g Zejej edœdd„Zeeejejejdœdd„ƒZdS )	ÚViewa§  Alternative way to use view functions.  A subclass has to implement
    :meth:`dispatch_request` which is called with the view arguments from
    the URL routing system.  If :attr:`methods` is provided the methods
    do not have to be passed to the :meth:`~flask.Flask.add_url_rule`
    method explicitly::

        class MyView(View):
            methods = ['GET']

            def dispatch_request(self, name):
                return f"Hello {name}!"

        app.add_url_rule('/hello/<name>', view_func=MyView.as_view('myview'))

    When you want to decorate a pluggable view you will have to either do that
    when the view function is created (by wrapping the return value of
    :meth:`as_view`) or you can use the :attr:`decorators` attribute::

        class SecretView(View):
            methods = ['GET']
            decorators = [superuser_required]

            def dispatch_request(self):
                ...

    The decorators stored in the decorators list are applied one after another
    when the view function is created.  Note that you can *not* use the class
    based decorators since those would decorate the view class and not the
    generated view function!
    N)Úreturnc             C   s
   t ƒ ‚dS )z­Subclasses have to override this method to implement the
        actual view function code.  This method is called with all
        the arguments from the URL rule.
        N)ÚNotImplementedError)Úself© r   ú,/tmp/pip-build-8om4l6ph/flask/flask/views.pyÚdispatch_request>   s    zView.dispatch_request)ÚnameÚ
class_argsÚclass_kwargsr   c                sz   t jt jtdœ‡ ‡‡fdd„‰| jrJ|ˆ_| jˆ_x| jD ]}|ˆƒ‰q:W | ˆ_|ˆ_| jˆ_| jˆ_| jˆ_| j	ˆ_	ˆS )a€  Converts the class into an actual view function that can be used
        with the routing system.  Internally this generates a function on the
        fly which will instantiate the :class:`View` on each request and call
        the :meth:`dispatch_request` method on it.

        The arguments passed to :meth:`as_view` are forwarded to the
        constructor of the class.
        )ÚargsÚkwargsr   c                 s   ˆj ˆ ˆŽ}tj|jƒ| |ŽS )N)Ú
view_classr   Úensure_syncr   )r   r   r   )r   r   Úviewr   r   r   R   s    zView.as_view.<locals>.view)
ÚtÚAnyr   Ú
decoratorsÚ__name__Ú
__module__r   Ú__doc__ÚmethodsÚprovide_automatic_options)Úclsr   r   r   Z	decoratorr   )r   r   r   r   Úas_viewE   s    zView.as_view)r    r!   Ú__qualname__r"   r#   r   ÚOptionalÚListÚstrr$   Úboolr   ÚCallabler   r   Úclassmethodr   r&   r   r   r   r   r      s   

r   c                   s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚMethodViewTypezYMetaclass for :class:`MethodView` that determines what methods the view
    defines.
    c                sx   t ƒ j|||ƒ d|krttƒ }x$|D ]}t|dd ƒr$|j|jƒ q$W x$tD ]}t| |ƒrJ|j|j	ƒ ƒ qJW |rt|| _d S )Nr#   )
ÚsuperÚ__init__ÚsetÚgetattrÚupdater#   Úhttp_method_funcsÚhasattrÚaddÚupper)r%   r   ÚbasesÚdr#   ÚbaseÚkey)Ú	__class__r   r   r0   o   s    


zMethodViewType.__init__)r    r!   r'   r"   r0   Ú__classcell__r   r   )r<   r   r.   j   s   r.   c               @   s&   e Zd ZdZejejedœdd„ZdS )Ú
MethodViewa   A class-based view that dispatches request methods to the corresponding
    class methods. For example, if you implement a ``get`` method, it will be
    used to handle ``GET`` requests. ::

        class CounterAPI(MethodView):
            def get(self):
                return session.get('counter', 0)

            def post(self):
                session['counter'] = session.get('counter', 0) + 1
                return 'OK'

        app.add_url_rule('/counter', view_func=CounterAPI.as_view('counter'))
    )r   r   r   c             O   sX   t | tjjƒ d ƒ}|d kr0tjdkr0t | dd ƒ}|d k	sHtdtj›�ƒ‚tj|ƒ||ŽS )NÚHEADr   zUnimplemented method )r2   r   ÚmethodÚlowerÚAssertionErrorr   r   )r   r   r   Úmethr   r   r   r   •   s
    zMethodView.dispatch_requestN)r    r!   r'   r"   r   r   r   r   r   r   r   r   r>   …   s   r>   )Ú	metaclass)Útypingr   Úglobalsr   r   r   Ú	frozensetr4   r   Útyper.   r>   r   r   r   r   Ú<module>   s   ]