Django, 사용자 지정 500/404 오류 페이지 만들기


105

여기에 있는 튜토리얼을 정확히 따르면 사용자 지정 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 내에서 문제가 발생했습니다.


1
디버그는 내 코드에서 False로 설정되어
자크

이것은 당신에게 도움이 될 수 stackoverflow.com/a/12180499/1628832
karthikr

1
사용자 지정 템플릿 만 만드는 방법을 찾고있는 동안이 답변을 찾았고 저는 많은 도움이 된 약간의 Django 문서를 공유하고 싶었습니다. docs.djangoproject.com/en/1.7/ref/views/…
Blackeagle52

광산은 template_dirs 설정없이 작동했습니다.
Programmingjoe

1
첫 줄의 링크가 Django의 404 페이지로 연결될 때 아이러니 한 점. 존재하지 않는 Django 버전에 대한 튜토리얼 페이지로 연결됩니다. 다음은 Django 2.0 튜토리얼 페이지에 대한 링크입니다. docs.djangoproject.com/en/2.0/intro/tutorial03
andrewec

답변:


120

기본 아래 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

이것은 나를 위해 꽤 잘 작동하는 것처럼 보였지만 어떤 이유로 request.user는 404 템플릿에서는 잘 보이지만 500 템플릿에서는 전혀 나타나지 않습니다 (거의 동일합니다)-여기에 질문을 게시했습니다 : stackoverflow.com/ 질문 / 26043211 /…
Gravity Grave

1
또 다른 궁금한 점은 관리자 백엔드를 사용하고 별도의 템플릿을 사용하려는 경우 어떻게됩니까? 제가 알기로, 관리자는 무시하고 코드의이 비트를 넣어 views.py이 없습니다.
중력 무덤

11
@GravityGrave는 500 서버 오류를보고하기 때문에 500 template렌더링하지 않으므로 request.user서버는 아무것도 제공 할 수 없습니다.
Aaron Lelevier 2014 년

5
장고 1.9와 나를 위해 작동하지 않았다 (어쩌면 내가 뭔가 잘못하고 있어요 handler404 방법이 있다고보기 정확히 호출 할 필요가 있음을 알고 장고 것입니다 예약 된 이름을 장고입니다.?
deathangel908

1
귀하의 의견을 바탕으로 답변을 업데이트했습니다. 업데이트가 너무 늦어서 죄송합니다. 도움이 되었기를 바랍니다.
Aaron Lelevier

71

공식 답변 :

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

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로 설정해야합니다, 그렇지 않으면 정상적인 디버그 핸들러가 사용됩니다.


1
추가했지만 작동하지 않습니다. 내보기에 적절한 장소를 가리키는 handler404 등을 추가, 아직 여전히 기본 404을보고 그리고 그래, 내가 디버그 거짓 모드에있어 1.9 사용하여 작업을 수행하지
KhoPhi

Django 1.9를 사용하고 단순히 500.html 등 템플릿을 추가하면 표준 페이지 대신 표시됩니다. 좋은 쉬운 수정.
curtisp

2
Gotcha 가 나를 도왔습니다. 내 settings.py에서 이러한 변경을 수행하고 DEBUG = False 및 ALLOWED_HOSTS = [ '0.0.0.0']을 설정하여 모든 클라이언트의 http 요청을 수락했습니다.
shaffooo

1
그냥 경우 다른 사람에 어디 지구에 궁금해 URLconf는, 여기있다
아서 Tarasov

38

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

# ...

5
handler400덮어 쓰기 위해서만 가져 오는 이유는 무엇 handler400 = 'myapp.views.bad_request'입니까?
Flimm


5
재정의하기 위해 여기에서 처리기를 가져올 필요가 없습니다.
funkotron 2011

1
당신은 사용하지 말아야합니다 render_to_response. 문서에서 : "권장되지 않으며 향후 더 이상 사용되지 않을 가능성이 있습니다."
Timmy O'Mahony

Django 1.10의 render_to_response경우 더 이상 사용되지 않을 예정이므로 다음을 참조하십시오 ( render대신 사용). stackoverflow.com/questions/44228397/…
mrdaliri

21

참조한 페이지에서 :

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

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

handler404 = 'views.my_404_view'

handler500과 유사합니다.


마이크는 어때요? 오늘은 장고 사용하여 내 첫 번째 날 내가 여전히 로프에 매달려있어
자크

2
@JimRilye 뷰에 적합한 500 함수를 추가 한 다음 해당 변수로 참조해야합니다. 따라서 urlpatterns = ...줄 위에 라는 줄 handler500 = 'views.handle500'을 추가 한 다음 def handle500(request):500.html을 표시하는 views.py에를 추가 하십시오.
Mike Pelley 2013

18

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


1
이 작품은 당신이 같은 것을 가지고 있는지 확인 'DIRS': [os.path.join(BASE_DIR, '<project_name>/templates')]에 템플릿 목록에서를 settings.py.
eric

12

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


나를 위해 일하십시오. 그러나 무엇 exception입니까?
zeleven

문서 링크에 따르면 : docs.djangoproject.com/en/2.1/ref/urls/… . 그것은 쓰여 : 메이크업 확실히 핸들러는 요청 및 예외 인수를 받아
Alouani 유네스을

1
Django 3.0 에서 나를 위해 일했습니다 . 그러나 무엇 locals()입니까? 파일은 pass.
enchance

9

settings.py :

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

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


사용 방법 raise Http404('msg'): stackoverflow.com/a/37109914/895245 {{ request_path }} 도 사용할 수 있습니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功


7

오류를 확인 장고 경로 stack.In 기본 의미 templates.I로드 어디에서 오류 페이지에서 찾을 template_dir의 이러한 HTML 페이지가 추가 500.html , 으로 404.html을 . 이러한 오류가 발생하면 각 템플릿 파일이 자동으로로드됩니다.

400403 과 같은 다른 오류 코드에 대한 페이지도 추가 할 수 있습니다 .

이 도움을 바랍니다 !!!


6

Django 3.x에서 수락 된 답변은 render_to_response완전히 제거되었으며 수락 된 답변이 작동 한 버전 이후로 더 많은 변경 사항이 있었기 때문에 작동하지 않습니다 .

다른 답변도 있지만 좀 더 깨끗한 답변을 제시하고 있습니다.

기본 urls.py파일에서 :

handler404 = 'yourapp.views.handler404'
handler500 = 'yourapp.views.handler500'

에서 yourapp/views.py파일 :

def handler404(request, exception):
    context = {}
    response = render(request, "pages/errors/404.html", context=context)
    response.status_code = 404
    return response


def handler500(request):
    context = {}
    response = render(request, "pages/errors/500.html", context=context)
    response.status_code = 500
    return response

가져온했는지 확인 render()yourapp/views.py파일 :

from django.shortcuts import render

참고 : render_to_response()Django에서 더 이상 사용되지 않으며 2.xverision에서 완전히 제거되었습니다 3.x.


5

한 줄로 (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)

1
그리고 그것을 어디에서 사용합니까?
Sami

4
# 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' 

이것은 django 2.0에서 작동합니다.

404.html앱 템플릿 폴더에 사용자 지정을 포함해야 합니다.


4

장고 3.0

여기 링크 오류보기를 사용자 정의하는 방법은

여기에 링크 하는 방법 뷰를 렌더링하는 방법은

urls.py(프로젝트 폴더의 주요 일), 넣어 :

handler404 = 'my_app_name.views.custom_page_not_found_view'
handler500 = 'my_app_name.views.custom_error_view'
handler403 = 'my_app_name.views.custom_permission_denied_view'
handler400 = 'my_app_name.views.custom_bad_request_view'

그리고 그 앱에서 ( my_app_name) 다음을 입력하십시오 views.py.

def custom_page_not_found_view(request, exception):
    return render(request, "errors/404.html", {})

def custom_error_view(request, exception=None):
    return render(request, "errors/500.html", {})

def custom_permission_denied_view(request, exception=None):
    return render(request, "errors/403.html", {})

def custom_bad_request_view(request, exception=None):
    return render(request, "errors/400.html", {})

참고 : error/404.html파일을 프로젝트 (앱이 아님) 템플릿 폴더에 templates/errors/404.html배치하는 경우 경로이므로 원하는 위치에 파일을 배치하고 올바른 경로를 작성하십시오.

참고 2 : 페이지를 다시로드 한 후에도 이전 템플릿이 계속 표시되면에서 변경하고 settings.py DEBUG=True저장 한 다음 다시로 변경합니다 False(서버를 다시 시작하고 새 파일 수집).


추가 참고 : DEUB=False정적 파일 에서 실행중인 경우 제공되지 않을 수 있으므로 사용자 지정 오류 템플릿 변경 사항을 미리 볼 수 없습니다. ./manage.py runserver --insecure어쨌든 django가 그들을 서비스하도록 강제하는 데 사용하십시오 .
Rob


3

오류 템플릿을 .../Django/mysite/templates/?

나는 이것에 대해 확신하지만 이것들이 웹 사이트에 "글로벌"이어야한다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.