Your IP : 216.73.216.213


Current Path : /opt/alt/python35/lib/python3.5/site-packages/raven/contrib/__pycache__/
Upload File :
Current File : //opt/alt/python35/lib/python3.5/site-packages/raven/contrib/__pycache__/flask.cpython-35.pyc



��Yw)�@sodZddlmZyddlmZWnek
rDdZYnXdZddlZddlZddl	m
Z
mZmZddl
mZmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZddlmZddlm Z m!Z!ddl"m#Z#ej$�Z%e%j&d�Z'ddd�Z(Gdd�de)�ZdS)z�
raven.contrib.flask
~~~~~~~~~~~~~~~~~~~

:copyright: (c) 2010-2012 by the Sentry Team, see AUTHORS for more details.
:license: BSD, see LICENSE for more details.
�)�absolute_import)�current_userFTN)�request�current_app�g)�got_request_exception�request_finished)�ClientDisconnected)�
setup_logging)�Client)�Sentry)�
SentryHandler)�urlparse)�
to_unicode)�get_headers�get_environ)�convert_options�logging_configuredc
Csk|t|jdd|dt|jjdg��t|jg�Bd|jjdg�dd|ii��S)	N�defaults�dsnZ
include_pathsZSENTRY_INCLUDE_PATHSZignore_exceptionsZRAVEN_IGNORE_EXCEPTIONS�extra�app)r�config�set�getZimport_name)�
client_clsrr�r�D/opt/alt/python35/lib/python3.5/site-packages/raven/contrib/flask.py�make_client's	rc@s0eZdZdZddedddejdddd�	Zedd��Z	e	j
d	d��Z	d
d�Zdd
�Zdd�Z
dd�Zdd�Zdd�Zddd�Zdd�Zdd�Zdddddddd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�ZdS)(ra�
    Flask application for Sentry.

    Look up configuration from ``os.environ['SENTRY_DSN']``::

    >>> sentry = Sentry(app)

    Pass an arbitrary DSN::

    >>> sentry = Sentry(app, dsn='http://public:secret@example.com/1')

    Pass an explicit client::

    >>> sentry = Sentry(app, client=client)

    Automatically configure logging::

    >>> sentry = Sentry(app, logging=True, level=logging.ERROR)

    Capture an exception::

    >>> try:
    >>>     1 / 0
    >>> except ZeroDivisionError:
    >>>     sentry.captureException()

    Capture a message::

    >>> sentry.captureMessage('hello, world!')

    By default, the Flask integration will do the following:

    - Hook into the `got_request_exception` signal. This can be disabled by
      passing `register_signal=False`.
    - Wrap the WSGI application. This can be disabled by passing
      `wrap_wsgi=False`.
    - Capture information from Flask-Login (if available).
    NFTc

Cs�|r"t|t�r"td��||_||_||_||_||_||_||_	|	|_
|r}|j|�dS)Nz&client should be an instance of Client)�
isinstancer�	TypeErrorr�logging�logging_exclusionsr�client�level�	wrap_wsgi�register_signal�init_app)
�selfrr#rrr!r"r$r%r&rrr�__init__es								zSentry.__init__cCs0ytjSWntk
rYnXt|dd�S)N�_last_event_id)r�sentry_event_id�	Exception�getattr)r(rrr�
last_event_idws

zSentry.last_event_idcCs/||_y
|t_Wntk
r*YnXdS)N)r*rr+r,)r(�valuerrrr.s
	

cOs*|js
dS|jd|jd��dS)N�exc_info)r#�captureExceptionr)r(�args�kwargsrrr�handle_exception�s	zSentry.handle_exceptioncCsi}y|jd}Wntk
r4|j}YnX|rE||d<tsO|Sttd�sb|Sy
tj}Wntk
r�|SYnXt	|�r�|�}|s�|Stj
�|d<dtjkrx7tjdD](}tt|�r�tt|�||<q�W|S)zu
        Requires Flask-Login (https://pypi.python.org/pypi/Flask-Login/)
        to be installed and setup.
        r�
ip_addressZ
login_manager�idZSENTRY_USER_ATTRS)
Zaccess_route�
IndexErrorZremote_addr�has_flask_login�hasattrrr�is_authenticated�AttributeError�callableZget_idrr-)r(rZ	user_infor5r:�attrrrr�
get_user_info�s2



		zSentry.get_user_infocCs7|j|j�r|j}n	|j}|j||�S)zR
        Determine how to retrieve actual data by using request.mimetype.
        )�is_json_typeZmimetype�
get_json_data�
get_form_data�get_http_info_with_retriever)r(r�	retrieverrrr�
get_http_info�s	zSentry.get_http_infocCs
|dkS)Nzapplication/jsonr)r(�content_typerrrr?�szSentry.is_json_typecCs|jS)N)Zform)r(rrrrrA�szSentry.get_form_datacCs|jS)N)�data)r(rrrrr@�szSentry.get_json_datacCs�|dkr|j}tj|j�}y||�}Wntk
rQi}YnXdd|j|j|jfd|jd|j	d|dt
t|j��dt
t
|j��iS)	zT
        Exact method for getting http_info but with form data work around.
        N�urlz	%s://%s%sZquery_string�methodrF�headers�env)rAr�urlsplitrGr	�scheme�netloc�path�queryrH�dictr�environr)r(rrCZurlpartsrFrrrrB�s	
		z#Sentry.get_http_info_with_retrievercOs�d|_tjr+|jjjtjj�y|jj|jt��Wn>t	k
r�}z|jj
jt|��WYdd}~XnXy|jj
|jt��Wn>t	k
r�}z|jj
jt|��WYdd}~XnXdS)N)r.r�url_ruler#�transaction�push�ruleZhttp_contextrDr,�logger�	exceptionr�user_contextr>)r(r2r3�errr�before_request�s		,zSentry.before_requestcOsO|jr|j|jd<|jjj�tjrK|jjjtjj	�|S)NzX-Sentry-ID)
r.rIr#�context�clearrrRrS�poprU)r(�sender�responser2r3rrr�
after_request�s		zSentry.after_requestc
Cs�|dk	r||_|dk	r*||_|dk	rB||_n3|jdkru|rl|jrld|_n	d|_|dk	r�||_|dk	r�||_|dk	r�||_|js�t|j	||j�|_|jr`i}|jdk	r|j|d<t
|jd|j�}	t|	|�|jj
dkrJ|jj|	�tj|dt
|�|jr�t|j|j�|_|j|j�tj|jd|�|jr�tj|jd|�t|d�s�i|_||jd<dS)	NFT�excluder$Zsentry_handlerr^�
extensionsZsentry)rr$r%�debugr&r!r"r#rrr
r
rV�	propagate�
addHandlerr�send�SentryMiddlewareZwsgi_apprZr�connectr`rr4r9rb)
r(rrr!r$r"r%r&r3�handlerrrrr'�sJ								

			zSentry.init_appcOsU|jstd��|jj||�}|rH|jj|�|_n	d|_|S)Nz5captureException called before application configured)r#�AssertionErrorr1�	get_identr.)r(r2r3�resultrrrr13s	zSentry.captureExceptioncOsU|jstd��|jj||�}|rH|jj|�|_n	d|_|S)Nz3captureMessage called before application configured)r#rj�captureMessagerkr.)r(r2r3rlrrrrm<s	zSentry.captureMessagecOs(|jstd��|jj||�S)Nz1user_context called before application configured)r#rjrX)r(r2r3rrrrXEszSentry.user_contextcOs(|jstd��|jj||�S)Nz1tags_context called before application configured)r#rj�tags_context)r(r2r3rrrrnIszSentry.tags_contextcOs(|jstd��|jj||�S)Nz2extra_context called before application configured)r#rj�
extra_context)r(r2r3rrrroMszSentry.extra_context)�__name__�
__module__�__qualname__�__doc__rr!�NOTSETr)�propertyr.�setterr4r>rDr?rAr@rBrZr`r'r1rmrXrnrorrrrr;s.&,
	7		r)*rs�
__future__rZflask_loginr�ImportErrorr8r!Zblinker�flaskrrrZ
flask.signalsrrZwerkzeug.exceptionsr	Z
raven.confr
Z
raven.baserZraven.middlewarerrgZraven.handlers.loggingr
Zraven.utils.compatrZraven.utils.encodingrZraven.utils.wsgirrZraven.utils.confr�	NamespaceZ
raven_signals�signalrr�objectrrrr�<module>s.