This repository was archived by the owner on Oct 23, 2023. It is now read-only.
This repository was archived by the owner on Oct 23, 2023. It is now read-only.
user_context is overwritten when Sentry(app) called after @before_request #842
Open
Description
If you initialize raven.contrib.flask.Sentry
after a Flask before_request
has been defined (in which sentry.user_context
is used), the user context is destroyed when sending errors.
For instance, in the code below the user context sent to Sentry only has an ip address. But if you uncomment "Option A" and comment out the "Option B", the user context contains [email protected]
(and the other items).
from flask import Flask
from raven.contrib.flask import Sentry
app = Flask(__name__)
# Option A
# sentry = Sentry(app)
# message = 'Option A'
@app.before_request
def before_request():
sentry.user_context({
'ip_address': '1.2.3.4',
'email': '[email protected]',
'username': 'someguy',
'id': '1238923',
})
sentry.extra_context({
'goo': 'bar',
'ip_address': '1.2.3.4',
'email': '[email protected]',
'username': 'someguy',
'id': '1238923',
})
# Option B
sentry = Sentry(app)
message = 'Option B'
@app.route('/')
def index():
raise Exception(message)
app.run(debug=True)
I think it's because get_user_info
in this spot returns None
and merging None
overwrites existing values:
>>> from raven.context import Context
>>> c = Context()
>>> c.merge({'user': {'foo': 'bar'}})
>>> c
<Context: {'user': {'foo': 'bar'}}>
>>> c.merge({'user': None})
>>> c
<Context: {'user': None}>
So maybe the fix is to have Context.merge
treat None
s as {}
. Or maybe get_user_info
should return {}
instead of None
.
Or maybe this:
diff --git a/raven/contrib/flask.py b/raven/contrib/flask.py
index a973344..6014c2c 100644
--- a/raven/contrib/flask.py
+++ b/raven/contrib/flask.py
@@ -221,7 +221,7 @@ class Sentry(object):
except Exception as e:
self.client.logger.exception(to_unicode(e))
try:
- self.client.user_context(self.get_user_info(request))
+ self.client.user_context(self.get_user_info(request) or {})
except Exception as e:
self.client.logger.exception(to_unicode(e))