[python] 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 / polls / 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'),
)

필요한 다른 코드를 게시 할 수 있지만 잘못된 URL을 사용하는 경우 사용자 지정 500 오류 페이지를 얻으려면 무엇을 변경해야합니까?

편집하다

솔루션 :
추가로

TEMPLATE_DIRS

내 settings.py 내에서 문제가 발생했습니다.



답변

기본 아래 views.py에 다음 두 가지보기의 사용자 정의 구현을 추가 하고 표시하려는 항목으로 템플릿 404.html500.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

최신 정보

handler404handler500에서 발견 장고 문자열 구성 변수를 수출하고 있습니다 django/conf/urls/__init__.py. 이것이 위의 구성이 작동하는 이유입니다.

위의 구성이 작동하도록하려면 urls.py파일에 다음 변수를 정의하고 내 보낸 Django 변수를 이러한 Django 기능 뷰가 정의 된 Python 경로의 문자열로 지정해야합니다.

# 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(template_name)
    response.status_code = 404
    return response


답변

공식 답변 :

다음은 사용자 지정 오류보기를 설정하는 방법에 대한 공식 문서에 대한 링크입니다.

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_deniedbad_request. 그들은 각각 그들을 찾아 낼 수있는 경우에 기본적으로, 그들은 이러한 템플릿을 사용 : 404.html, 500.html, 403.html,와 400.html.

따라서 원하는 모든 것이 오류 페이지를 만드는 것뿐이라면 TEMPLATE_DIRS디렉토리에 해당 파일을 생성 하면 URLConf를 전혀 편집 할 필요가 없습니다. 사용 가능한 컨텍스트 변수를 보려면 문서를 읽으십시오.

Django 1.10 이상에서 기본 CSRF 오류보기는 템플릿을 사용합니다 403_csrf.html.

잡았다 :

그는 잊지 마세요 DEBUG작업에이 false로 설정해야합니다, 그렇지 않으면 정상적인 디버그 핸들러가 사용됩니다.


답변

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

# ...


답변

참조한 페이지에서 :

뷰 내에서 Http404를 발생 시키면 Django는 404 오류를 처리하는 특수 뷰를로드합니다. 루트 URLconf에서 변수 handler404를 찾아 찾습니다 (루트 URLconf에서만, 다른 곳에 handler404를 설정하면 효과가 없음). Python 점으로 구분 된 구문의 문자열 인 일반 URLconf 콜백에서 사용하는 것과 동일한 형식입니다. 404보기 자체에는 특별한 것이 없습니다. 단지 일반적인보기 일뿐입니다.

따라서 urls.py에 다음과 같은 내용을 추가해야한다고 생각합니다.

handler404 = 'views.my_404_view'

handler500과 유사합니다.


답변

에서 사이트에 대한 멋진 오류 메시지가있는 사용자 정의 페이지를 표시하는 것이 필요한 경우 DEBUG = False템플릿 디렉토리에 404.html 및 500.html이라는 두 개의 템플릿을 추가하면 404 또는 500 일 때이 사용자 정의 페이지가 자동으로 선택됩니다. 제기됩니다.


답변

에서 장고 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을 만들고 사이트 전체 오류, 컨텍스트 프로세서를 처리합니다.


답변

settings.py :

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

템플릿 폴더에 404.html500.html페이지를 추가하기 만하면 됩니다. 제거 404.html500.html설문 조사 응용 프로그램 템플릿에서.