it-swarm.dev

Django ، إنشاء صفحة خطأ 500/404 مخصصة

باتباع البرنامج التعليمي الموجود هنا بالضبط ، لا يمكنني إنشاء صفحة خطأ مخصصة 500 أو 404. إذا قمت بكتابة عنوان url غير صحيح ، فإن الصفحة تعطيني صفحة الخطأ الافتراضية. هل هناك أي شيء يجب أن أتحقق منه يمنع صفحة مخصصة من الظهور؟

دلائل الملفات:

mysite/
    mysite/
        __init__.py
        __init__.pyc
        settings.py
        settings.pyc
        urls.py
        urls.pyc
        wsgi.py
        wsgi.pyc
    polls/
        templates/
            admin/
                base_site.html
            404.html
            500.html
            polls/
                detail.html
                index.html
        __init__.py
        __init__.pyc
        admin.py
        admin.pyc
        models.py
        models.pyc
        tests.py
        urls.py
        urls.pyc
        view.py
        views.pyc
    templates/
    manage.py

ضمن mysite/settings.py قمت بتمكين هذه:

DEBUG = False
TEMPLATE_DEBUG = DEBUG

#....

TEMPLATE_DIRS = (
    'C:/Users/Me/Django/mysite/templates', 
)

ضمن mysite/استطلاعات الرأي/urls.py:

from Django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
    url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
    url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),
)

يمكنني نشر أي تعليمات برمجية أخرى ضرورية ، لكن ما الذي يجب تغييره للحصول على صفحة خطأ مخصصة 500 إذا كنت تستخدم عنوان url غير صحيح؟

تحرير

الحل: كان عندي مبلغ إضافي

TEMPLATE_DIRS

داخل الإعدادات الخاصة بي. وهذا كان سبب المشكلة

73
Zac

ضمن views.py الرئيسي ، أضف تطبيقك المخصص للعرضين التاليين ، وقم فقط بإعداد القوالب 404.html و 500.html مع ما تريد عرضه.

مع هذا الحل ، لا يلزم إضافة رمز مخصص إلى urls.py

إليك الكود:

from Django.shortcuts import render_to_response
from Django.template import RequestContext


def handler404(request, *args, **argv):
    response = render_to_response('404.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 404
    return response


def handler500(request, *args, **argv):
    response = render_to_response('500.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 500
    return response

تحديث

يتم تصدير handler404 و handler500 متغيرات تكوين سلسلة Django الموجودة في Django/conf/urls/__init__.py. هذا هو السبب في أن التكوين أعلاه يعمل.

للحصول على التكوين أعلاه للعمل ، يجب عليك تحديد المتغيرات التالية في ملف urls.py الخاص بك والإشارة إلى متغيرات Django المصدرة إلى السلسلة Python حيث يتم تعريف طرق العرض الوظيفية Django هذه ، مثل ذلك:

# project/urls.py

handler404 = 'my_app.views.handler404'
handler500 = 'my_app.views.handler500'

تحديث لـ Django 2.0

تم تغيير توقيعات طرق عرض المعالج في Django 2.0: https://docs.djangoproject.com/en/2.0/ref/views/#error-views

إذا كنت تستخدم طرق العرض على النحو الوارد أعلاه ، فسوف تفشل handler404 مع الرسالة:

"حصل handler404 () على وسيطة غير متوقعة 'استثناء'

في هذه الحالة ، قم بتعديل وجهات نظرك مثل هذا:

def handler404(request, exception, template_name="404.html"):
    response = render_to_response("404.html")
    response.status_code = 404
    return response
95
Aaron Lelevier

الجواب الرسمي:

فيما يلي الرابط الخاص بالوثائق الرسمية حول كيفية إعداد طرق عرض الأخطاء المخصصة:

https://docs.djangoproject.com/en/stable/topics/http/views/#customizing-error-views

تقول لإضافة خطوط مثل هذه في URLconf الخاص بك (تعيينهم في أي مكان آخر لن يكون له أي تأثير):

handler404 = 'mysite.views.my_custom_page_not_found_view'
handler500 = 'mysite.views.my_custom_error_view'
handler403 = 'mysite.views.my_custom_permission_denied_view'
handler400 = 'mysite.views.my_custom_bad_request_view'

يمكنك أيضًا تخصيص عرض خطأ CSRF عن طريق تعديل الإعداد CSRF_FAILURE_VIEW .

معالجات الخطأ الافتراضية:

يجدر قراءة وثائق معالجات الأخطاء الافتراضية ، page_not_found ، server_error ، permission_denied و bad_request . بشكل افتراضي ، يستخدمون هذه القوالب إذا تمكنوا من العثور عليها ، على التوالي: 404.html و 500.html و 403.html و 400.html.

لذلك إذا كان كل ما تريد القيام به هو إنشاء صفحات خطأ جميلة ، فما عليك سوى إنشاء هذه الملفات في دليل TEMPLATE_DIRS ، فلن تحتاج إلى تحرير URLConf على الإطلاق. اقرأ الوثائق لمعرفة متغيرات السياق المتاحة.

في Django 1.10 والإصدارات الأحدث ، يستخدم عرض خطأ CSRF الافتراضي القالب 403_csrf.html.

مسكتك:

لا تنسَ أن DEBUG يجب ضبطها على False لكي تعمل هذه ، وإلا ، فسيتم استخدام معالجات تصحيح الأخطاء العادية.

48
Flimm

أضف هذه السطور في urls.py

urls.py

from Django.conf.urls import (
handler400, handler403, handler404, handler500
)

handler400 = 'my_app.views.bad_request'
handler403 = 'my_app.views.permission_denied'
handler404 = 'my_app.views.page_not_found'
handler500 = 'my_app.views.server_error'

# ...

وتنفيذ وجهات نظرنا المخصصة في views.py.

views.py

from Django.shortcuts import (
render_to_response
)
from Django.template import RequestContext

# HTTP Error 400
def bad_request(request):
    response = render_to_response(
        '400.html',
        context_instance=RequestContext(request)
        )

        response.status_code = 400

        return response

# ...
32
Armance

من الصفحة التي أشرت إليها:

عندما ترفع Http404 من داخل طريقة عرض ، سيقوم Django بتحميل عرض خاص مخصص لمعالجة أخطاء 404. يجدها من خلال البحث عن المعالج المتغير 404 في URLconf الجذر الخاص بك (وفقط في URL URL الخاص بجذرك ؛ لن يكون لإعداد handler404 في أي مكان آخر أي تأثير) ، وهو عبارة عن سلسلة في بناء جملة Python منقط - بنفس التنسيق الذي تستخدمه عمليات الاسترجاعات URLconf العادية. لا تتمتع طريقة العرض 404 نفسها بأي شيء مميز: إنها مجرد منظر طبيعي.

لذلك أعتقد أنك بحاجة إلى إضافة شيء مثل هذا إلى عنوان urls.py الخاص بك:

handler404 = 'views.my_404_view'

وما شابه ذلك ل handler500.

19
Mike Pelley

إذا كان كل ما تحتاجه هو عرض الصفحات المخصصة التي تحتوي على بعض رسائل الخطأ الهائلة لموقعك عند DEBUG = False ، فأضف نموذجين باسم 404.html و 500.html في دليل القوالب الخاص بك وسوف يلتقط هذه الصفحات المخصصة تلقائيًا عند 404 أو 500 مرفوع.

18
Krishna G Nair

ل Django 2 اتبع هذه الخطوات.

قم بتعديل ملف project/settings.py لتبدو كما يلي:

DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1','localhost']

أضف هذا إلى views.py:

def error_404_view(request, exception):
    return render(request,'myapp/404.html')

قم بإنشاء ملف 404.html مخصص.

انتقل الآن إلى ملف urls.py الخاص بمشروعك وأضف هذا السطر بعد urlpatterns:

handler404 = 'myapp.views.error_404_view'

الآن إذا ذهبت إلى المستعرض الخاص بك وفتحت أي عنوان URL غير موجود ، فسيظهر لك صفحة خطأ 404 مخصصة.

12
Alex Jolig

settings.py ::::

DEBUG = False
TEMPLATE_DEBUG = DEBUG
ALLOWED_HOSTS = ['localhost']  #provide your Host name

وأضف فقط صفحات 404.html و 500.html في مجلد القوالب. إزالة 404.html و 500.html من القوالب في تطبيق الاستطلاعات.

9
Rakesh babu

في Django 2. * يمكنك استخدام هذا البناء في views.py

def handler404(request, exception):
    return render(request, 'errors/404.html', locals())

في settings.py

DEBUG = False

if DEBUG is False:
    ALLOWED_HOSTS = [
        '127.0.0.1:8000',
        '*',
    ]

if DEBUG is True:
    ALLOWED_HOSTS = []

في urls.py

# https://docs.djangoproject.com/en/2.0/topics/http/views/#customizing-error-views
handler404 = 'YOUR_APP_NAME.views.handler404'

عادةً ما أقوم بإنشاء default_app والتعامل مع الأخطاء على مستوى الموقع ومعالجات السياق فيه.

7
DeN

قم بخطأ ما ، في صفحة الخطأ ، اكتشف من حيث يتم تحميل Django القوالب. أقصد مجموعة المسار. في الأساس template_dir أضف صفحات HTML هذه 500.html ، 404.html . عند حدوث هذه الأخطاء ، سيتم تحميل ملفات القوالب المعنية تلقائيًا.

يمكنك إضافة صفحات لرموز الأخطاء الأخرى أيضًا ، مثل 400 و 403 .

نأمل أن تكون هذه المساعدة !!!

7
allsyed

كسطر واحد (ل 404 صفحة عامة):

from Django.shortcuts import render_to_response
from Django.template import RequestContext

return render_to_response('error/404.html', {'exception': ex},
                                      context_instance=RequestContext(request), status=404)
5
FireZenk
# views.py
def handler404(request, exception):
    context = RequestContext(request)
    err_code = 404
    response = render_to_response('404.html', {"code":err_code}, context)
    response.status_code = 404
    return response

# <project_folder>.urls.py
handler404 = 'todo.views.handler404' 

هذا يعمل على جانغو 2.0

تأكد من تضمين 404.html المخصص الخاص بك داخل مجلد قوالب التطبيق.

4
Ndamulelo Nemakhavhani

حاول نقل قوالب الخطأ الخاصة بك إلى .../Django/mysite/templates/؟

لست متأكدًا من هذا ، لكنني أعتقد أن هذه يجب أن تكون "عالمية" على الموقع.

3
astrognocci