Django 1.11集成Raven 6.8.0:Sentry用户反馈功能无法启用求助
解决Django 1.11 + Raven 6.8.0中Sentry用户反馈无eventId的问题
我之前也碰到过一模一样的情况,在Django 1.11搭配旧版raven时,500错误页面里确实经常出现request对象没有sentry属性的问题——这是因为默认的错误处理流程没有把Sentry的事件ID注入到request上下文里。下面是几个亲测有效的解决办法:
1. 检查并确认Raven中间件的配置顺序
首先确保你的settings.py里正确添加了Raven的中间件,而且顺序要对——必须放在异常处理中间件之前,这样才能在错误发生时及时捕获并注入事件ID:
MIDDLEWARE = [ # 先放基础中间件(比如CommonMiddleware) 'raven.contrib.django.raven_compat.middleware.SentryResponseErrorIdMiddleware', 'raven.contrib.django.raven_compat.middleware.SentryLogMiddleware', # 再放异常处理相关的中间件 ]
这个中间件会把事件ID存入request.META['sentry_event_id'],即便request.sentry不存在,你也能从这里拿到有效ID。
2. 修改500.html模板,直接从META中获取eventId
不需要依赖request.sentry,直接从request的META属性里提取事件ID,再传给Raven.showReportDialog:
<script src="https://cdn.ravenjs.com/3.27.0/raven.min.js"></script> <script> Raven.config('你的Sentry DSN').install(); // 从request.META中获取事件ID,为空时返回空字符串避免渲染错误 var eventId = '{{ request.META.sentry_event_id|default:"" }}'; if (eventId) { Raven.showReportDialog({ eventId: eventId }); } </script>
3. 自定义500错误视图(终极方案)
如果上面的方法还是不生效,那就自己写一个500错误视图,手动获取事件ID并传入模板上下文:
第一步:在你的app中添加自定义视图
比如在yourapp/views.py里:
from django.shortcuts import render from raven.contrib.django.raven_compat.models import client def custom_500(request): # 获取当前请求对应的Sentry事件ID event_id = client.get_ident(request) # 将event_id传入模板上下文 return render(request, '500.html', {'event_id': event_id}, status=500)
第二步:在settings.py中配置自定义错误视图
确保DEBUG为False(DEBUG模式下Django会用自带的错误页面),然后指定自定义的500视图:
DEBUG = False ALLOWED_HOSTS = ['你的域名或主机地址'] # 指定自定义500错误视图的路径 handler500 = 'yourapp.views.custom_500'
第三步:修改模板使用传入的event_id
<script src="https://cdn.ravenjs.com/3.27.0/raven.min.js"></script> <script> Raven.config('你的Sentry DSN').install(); var eventId = '{{ event_id|default:"" }}'; if (eventId) { Raven.showReportDialog({ eventId: eventId }); } </script>
这样就能确保每次500错误发生时,模板都能拿到有效的事件ID,正常触发Sentry的用户反馈对话框。
内容的提问来源于stack exchange,提问作者Marco Herrarte
相关产品推荐
相关产品推荐

