B Yw)@sdZddlmZyddlmZWnek r8dZYnXdZddlZddlZddl m Z m Z m Z ddl mZmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlm Z m!Z!ddl"m#Z#e$Z%e%&dZ'dddZ(Gddde)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_appg)got_request_exceptionrequest_finished)ClientDisconnected) setup_logging)Client)Sentry) SentryHandler)urlparse) to_unicode) get_headers get_environ)convert_optionslogging_configuredc CsF|ft|j|t|jdgt|jgB|jdgd|iddS)NZSENTRY_INCLUDE_PATHSZRAVEN_IGNORE_EXCEPTIONSapp)dsnZ include_pathsZignore_exceptionsextra)defaults)rconfigsetgetZ import_name) client_clsrrrD/opt/alt/python37/lib/python3.7/site-packages/raven/contrib/flask.py make_client's  rc @seZdZdZddedddejddf ddZeddZ e j d dZ d d Z d d Z ddZ ddZddZddZd(ddZddZddZd)ddZddZd 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 CsX|rt|tstd||_||_||_||_||_||_||_ | |_ |rT| |dS)Nz&client should be an instance of Client) isinstancer TypeErrorrlogginglogging_exclusionsrclientlevel wrap_wsgiregister_signalinit_app) selfrr#rrr!r"r$r%r&rrr__init__eszSentry.__init__cCs(ytjStk rYnXt|ddS)N_last_event_id)rsentry_event_id Exceptiongetattr)r(rrr last_event_idws zSentry.last_event_idcCs*||_y |t_Wntk r$YnXdS)N)r*rr+r,)r(valuerrrr.s  cOs |js dS|j|dddS)Nexc_info)r0)r#captureExceptionr)r(argskwargsrrrhandle_exceptionszSentry.handle_exceptioncCsi}y|jd}Wntk r,|j}YnX|r:||d<tsB|SttdsP|Sy tj}Wntk rn|SXt |r~|}|s|St |d<dtj krx*tj dD]}tt|rt t|||<qW|S)zu Requires Flask-Login (https://pypi.python.org/pypi/Flask-Login/) to be installed and setup. r ip_addressZ login_manageridZSENTRY_USER_ATTRS) Z access_route IndexErrorZ remote_addrhas_flask_loginhasattrrris_authenticatedAttributeErrorcallableZget_idrr-)r(rZ user_infor5r:attrrrr get_user_infos2      zSentry.get_user_infocCs&||jr|j}n|j}|||S)zR Determine how to retrieve actual data by using request.mimetype. ) is_json_typeZmimetype get_json_data get_form_dataget_http_info_with_retriever)r(r retrieverrrr get_http_infos zSentry.get_http_infocCs|dkS)Nzapplication/jsonr)r( content_typerrrr?szSentry.is_json_typecCs|jS)N)Zform)r(rrrrrAszSentry.get_form_datacCs|jS)N)data)r(rrrrr@szSentry.get_json_datacCsz|dkr|j}t|j}y ||}Wntk r>i}YnXd|j|j|jf|j|j |t t |j t t |j dS)zT Exact method for getting http_info but with form data work around. Nz %s://%s%s)urlZ query_stringmethodrFheadersenv)rArurlsplitrGr schemenetlocpathqueryrHdictrenvironr)r(rrCZurlpartsrFrrrrBs    z#Sentry.get_http_info_with_retrieverc Osd|_tjr|jjtjjy|j|tWn4t k rh}z|jj t |Wdd}~XYnXy|j |tWn4t k r}z|jj t |Wdd}~XYnXdS)N)r.rurl_ruler# transactionpushruleZ http_contextrDr,logger exceptionr user_contextr>)r(r2r3errrbefore_requests$zSentry.before_requestcOs:|jr|j|jd<|jjtjr6|jjtjj |S)Nz X-Sentry-ID) r.rIr#contextclearrrRrSpoprU)r(senderresponser2r3rrr after_requests   zSentry.after_requestc Csd|dk r||_|dk r||_|dk r,||_n"|jdkrN|rH|jrHd|_nd|_|dk r\||_|dk rj||_|dk rx||_|jst|j ||j|_|jri}|jdk r|j|d<t |j|jd} t | f||j j dkr|j | tj|fdt i||jrt|j|j|_||jtj|j|d|jrDtj|j|dt|dsVi|_||jd<dS) NFTexclude)r$Zsentry_handler)r^ extensionsZsentry)rr$r%debugr&r!r"r#rrr r rV propagate addHandlerrsendSentryMiddlewareZwsgi_apprZrconnectr`rr4r9rb) r(rrr!r$r"r%r&r3handlerrrrr'sJ         zSentry.init_appcOs:|jstd|jj||}|r0|j||_nd|_|S)Nz5captureException called before application configured)r#AssertionErrorr1 get_identr.)r(r2r3resultrrrr13s zSentry.captureExceptioncOs:|jstd|jj||}|r0|j||_nd|_|S)Nz3captureMessage called before application configured)r#rjcaptureMessagerkr.)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)N)NNNNNN)__name__ __module__ __qualname____doc__r r!NOTSETr)propertyr.setterr4r>rDr?rAr@rBrZr`r'r1rmrXrnrorrrrr ;s.& ,   7  r )N)*rs __future__rZ flask_loginr ImportErrorr8r!ZblinkerflaskrrrZ flask.signalsrrZwerkzeug.exceptionsr Z raven.confr Z raven.baser Zraven.middlewarer rgZraven.handlers.loggingr Zraven.utils.compatrZraven.utils.encodingrZraven.utils.wsgirrZraven.utils.confr NamespaceZ raven_signalssignalrrobjectrrrrs.