كيف أقوم بتضمين تتبع المكدس في صفحة Django 500.html الخاصة بي؟

StackOverflow https://stackoverflow.com/questions/121439

سؤال

أنا أركض Django 1.0 وأنا على وشك نشر تطبيقي.على هذا النحو، سأقوم بتغيير إعداد DEBUG إلى False.

ومع ذلك، ما زلت أرغب في تضمين تتبع المكدس في صفحة 500.html الخاصة بي عند حدوث أخطاء.ومن خلال القيام بذلك، يمكن للمستخدمين نسخ الأخطاء ولصقها وإرسالها بالبريد الإلكتروني بسهولة إلى المطورين.

هل لديك أي أفكار حول أفضل السبل للتعامل مع هذه المشكلة؟

هل كانت مفيدة؟

المحلول

قم بتسجيل الـ 500 الخاصة بك تلقائيًا بهذه الطريقة:

  • أنت تعرف متى تحدث.
  • لا تحتاج إلى الاعتماد على المستخدمين الذين يرسلون لك تتبعات مكدسة.

يوصي جويل بالذهاب إلى أبعد من ذلك حيث يتم إنشاء التذاكر تلقائيًا في متتبع الأخطاء الخاص بك عندما يواجه تطبيقك فشلًا.أنا شخصياً أقوم بإنشاء موجز RSS (خاص) باستخدام التتبعات المكدسة وعناوين URL وما إلى ذلك.التي يمكن للمطورين الاشتراك فيها.

من ناحية أخرى، قد يؤدي عرض تتبعات المكدس للمستخدمين إلى تسرب المعلومات التي يمكن أن يستخدمها المستخدمون الضارون لمهاجمة موقعك.تعد رسائل الخطأ المفصلة بشكل مفرط إحدى الخطوات الكلاسيكية لهجمات حقن SQL.

يحرر (تمت إضافة نموذج التعليمات البرمجية لالتقاط التتبع):

يمكنك الحصول على معلومات الاستثناء من استدعاء sys.exc_info.بينما يأتي تنسيق التتبع للعرض من وحدة التتبع:

import traceback
import sys

try:
    raise Exception("Message")
except:
    type, value, tb = sys.exc_info()
    print >> sys.stderr,  type.__name__, ":", value
    print >> sys.stderr, '\n'.join(traceback.format_tb(tb))

مطبوعات:

Exception : Message
  File "exception.py", line 5, in <module>
    raise Exception("Message")

نصائح أخرى

كما يقولzacherates، أنت حقًا لا تريد عرض تتبع المكدس لمستخدميك.أسهل طريقة لحل هذه المشكلة هي ما يفعله Django افتراضيًا إذا قمت بإدراج نفسك والمطورين لديك في إعداد ADMINS بعناوين البريد الإلكتروني؛يرسل بريدًا إلكترونيًا إلى كل شخص في تلك القائمة مع تتبع المكدس الكامل (والمزيد) في كل مرة يوجد خطأ 500 مع DEBUG = False.

إذا أردنا إظهار الاستثناءات التي تم إنشاؤها، في قالب ur الخاص بك (500.html)، فيمكننا كتابة عرض 500 الخاص بك، والتقاط الاستثناء وتمريره إلى قالب 500 الخاص بك.

خطوات:

# في طرق العرض.py:

import sys,traceback

def custom_500(request):
    t = loader.get_template('500.html')

    print sys.exc_info()
    type, value, tb = sys.exc_info()
    return HttpResponseServerError(t.render(Context({
        'exception_value': value,
        'value':type,
        'tb':traceback.format_exception(type, value, tb)
    },RequestContext(request))))

# في urls.py الرئيسي:

from django.conf.urls.defaults import *
handler500 = 'project.web.services.views.custom_500'

# في القالب (500.html):

{{ exception_value }}{{value}}{{tb}}

المزيد عنها هنا: https://docs.djangoproject.com/en/dev/topics/http/views/#the-500-server-error-view

يمكنك الاتصال sys.exc_info() في معالج الاستثناء المخصص.لكنني لا أوصي بذلك.يمكن لـ Django أن يرسل إليك رسائل بريد إلكتروني للاستثناءات.

أعلم أن هذا سؤال قديم، ولكن في هذه الأيام أوصي باستخدام خدمة مثل خفير لالتقاط الأخطاء الخاصة بك.

في Django، خطوات إعداد ذلك بسيطة للغاية.من المستندات:

  • تثبيت الغراب باستخدام pip install raven
  • يضيف 'raven.contrib.django.raven_compat' لك settings.INSTALLED_APPS.
  • يضيف RAVEN_CONFIG = {"dsn": YOUR_SENTRY_DSN} إلى الإعدادات الخاصة بك.

ثم، في صفحتك الـ 500 (المحددة في handler500)، مرر ال request.sentry.id إلى القالب ويمكن للمستخدمين الرجوع إلى الخطأ المحدد دون الكشف عن أي من الأجزاء الداخلية لديك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top