Skip to content
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
@iffy

Description

@iffy

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 Nones 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))

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions