programing

장고, 사용자 지정 500/404 오류 페이지 생성

telecom 2023. 9. 27. 16:54
반응형

장고, 사용자 지정 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 오류 페이지를 얻으려면 무엇을 변경해야 합니까?

의 본위 에서.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/conf/urls/__init__.py의 구성이 이것이 위 구성이 작동하는 이유입니다.

하려면 urls.py내보낸 Django 변수를 다음과 같이 파일로 지정하여 이러한 Django 함수 뷰가 정의된 문자열 Python 경로를 가리킵니다.

# project/urls.py

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

장고 2.0 업데이트

Django 2.0에서 핸들러 보기에 대한 서명이 변경되었습니다: https://docs.djangoproject.com/en/2.0/ref/views/ #error-views

위와 같은 보기를 사용하면 핸들러 404가 실패하고 다음 메시지가 표시됩니다.

"handler404 (), 예상치 못한 키워드 논쟁 'exception' 받아"

이 경우 보기를 다음과 같이 수정합니다.

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/ #사용자 정의-오류-보기

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 오류 보기를 사용자 정의할 수도 있습니다.

기본 오류 처리기:

기본 오류 처리기 , , 및 의 설명서를 읽을 가치가 있습니다. 기본적으로 찾을 수 있는 경우 템플릿을 각각 사용합니다.404.html,500.html,403.html,그리고.400.html.

그래서 만일 당신이 원하는 것이 단지 꽤 많은 에러 페이지를 만드는 것이라면, 그냥 그 파일들을 a안에 만드세요.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

# ...

장고 3.0+ 4.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", {})

참고: errors/404.html파일을 (앱이 아닌) 프로젝트 템플릿 폴더에 배치할 경우의 경로입니다.templates/errors/404.html파일을 원하는 곳에 배치하고 올바른 경로를 작성해주세요.

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

참조한 페이지에서 다음을(를)

뷰 내에서 Http404를 올리면 장고는 404개의 오류를 처리하는 데 전념하는 특별한 뷰를 로드합니다.루트 URLconf에서 변수 핸들러 404를 찾음으로써(루트 URLconf에서만) 찾을 수 있습니다. 핸들러 404를 다른 곳에서는 설정해도 아무런 효과가 없습니다.) 이는 일반 URLconf 콜백이 사용하는 형식과 동일한 형식인 Python 점선 구문의 문자열입니다.404 뷰 자체는 특별한 것이 없습니다.그냥 평범한 풍경일 뿐입니다.

그래서 나는 당신이 당신의 URL에 이런 것을 추가해야 한다고 생각합니다.py:

handler404 = 'views.my_404_view'

핸들러 500의 경우도 마찬가지입니다.

만약 당신이 당신의 사이트에 대한 멋진 에러 메시지가 있는 사용자 정의 페이지를 보여주는 것만 필요하다면 다음과 같이.DEBUG = False, 그런 다음 템플릿 디렉토리에 404.html 및 500.html라는 두 개의 템플릿을 추가하고 404 또는 500을 올릴 때 이 사용자 정의 페이지를 자동으로 선택합니다.

장고에서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()2.x된 상태입니다3.x.

추가 보기는 필요 없습니다.https://docs.djangoproject.com/en/3.0/ref/views/

오류 파일을 템플릿 디렉토리의 루트에 넣기만 하면 됩니다.

  • 404.
  • 400개.
  • 403.
  • 500개.

디버그가 False일 때는 오류 페이지를 사용해야 합니다.

설정.py:

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

그리고 그냥 당신의 것을 추가합니다.404.html그리고.500.html템플릿 폴더의 페이지.제거한다.404.html그리고.500.html.에서의 에서.

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

오류 페이지에서 django가 템플릿을 로드하는 위치를 확인합니다.경로 스택 말입니다.etemplate_dir htmll500.html,404.html하면 해당 이러한 오류가 발생하면 해당 템플릿 파일이 자동으로 로드됩니다.

400이나 403 같은 다른 에러 코드에 대해서도 페이지를 추가할 수 있습니다.

한 줄로(일반 페이지 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)
# 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.htmltemplates다.

을 (으)로..../Django/mysite/templates/.

이것에 대해서는 잘 모르겠지만, 저는 이것들이 웹사이트에 "글로벌"되어야 한다고 생각합니다.

장고 루트 urls.py 파일에서 아래 행을 추가합니다.

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

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

앱의 views.py 파일에서 각각의 기능을 만듭니다.

def server_error(request, exception=None):
    # return render(request, '500.html')
    return redirect('/')

으로, 의 설정을 합니다.파이 파일에 세트DEBUG = False

저는 추가로.

TEMPLATE_DIRS

settings.py문제의 원인이 되고 있었습니다


이 답변은 C BY-SA 3.0에 따라 OP reZach에 의해 사용자 지정 500/404 오류 페이지를 생성하여 Django 질문에 대한 편집으로 게시되었습니다.

장고 > 2.2

from django.shortcuts import render_to_response, render
from django.template import RequestContext
def handler500(request, *args, **argv):
    context = {}
    print(request.body, '==========')
    response = render(request, '500.jinja', context=context)
    response.status_code = 500
    return response

urls.py 에서

handler500 = 'apps.core.views.handler500'

urls.py, 다음 코드를 입력합니다.

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

handler404 = 'my_app.views.page_not_found_view'

그런 다음 이 코드를 views.py 에 추가합니다.

from django.shortcuts import render,get_object_or_404
def page_not_found_view(request, exception):
    return render(request, '404.html', status=404)

설정하는 것을 잊지 마십시오.DEBUG = False 세트tALLOWED_HOSTS = [127.0.0.1]노트북에서 테스트를 하는 동안.

거 할 , .404.html파일을 템플릿에 저장합니다.에 가다settings.py설정:

DEBUG = False
ALLOWED_HOSTS = ["*"] 

기본값을 자동으로 덮어씁니다.

언급URL : https://stackoverflow.com/questions/17662928/django-creating-a-custom-500-404-error-page

반응형