Подтвердить что ты не робот

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'),
)

Я могу опубликовать любой другой необходимый код, но что я должен изменить, чтобы получить пользовательскую страницу с ошибкой 500, если я использую неверный URL?

редактировать

РЕШЕНИЕ: у меня было дополнительное

TEMPLATE_DIRS

в моем settings.py и это вызывало проблему

4b9b3361

Ответ 1

Под вашим основным 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

Ответ 2

Официальный ответ:

Вот ссылка на официальную документацию по настройке пользовательских представлений ошибок:

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, иначе будут использоваться обычные обработчики отладки.

Ответ 3

Добавьте эти строки в 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

# ...

Ответ 4

На странице, на которую вы ссылались:

Когда вы поднимаете Http404 из представления, Django загружает специальное представление, посвященное обработке 404 ошибок. Он находит это, ища переменную handler404 в вашем корневом URLconf (и только в вашем корневом URLconf; установка handler404 нигде не будет иметь никакого эффекта), которая является строкой в ​​синтаксисе с точками Python - в том же формате, что и обычные обратные вызовы URLconf. Сам вид 404 не имеет ничего особенного: его просто нормальный вид.

Итак, я считаю, что вам нужно добавить что-то подобное на ваш urls.py:

handler404 = 'views.my_404_view'

и аналогичный для handler500.

Ответ 5

Если вам нужно показать пользовательские страницы с некоторыми причудливыми сообщениями об ошибках для вашего сайта, когда DEBUG = False, добавьте два шаблона с именем 404.html и 500.html в свой каталог шаблонов, и он автоматически подберет этот обычай страниц при поднятии 404 или 500.

Ответ 6

Для 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 строку после urlpatterns:

handler404 = 'myapp.views.error_404_view'

Теперь, если вы зайдете в свой браузер и откроете любой несуществующий URL, вам будет показана пользовательская страница ошибки 404.

Ответ 7

settings.py::

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

и просто добавьте страницы 404.html и 500.html в папку шаблонов. удалите 404.html и 500.html из шаблонов в приложении опросов.

Ответ 8

Сделайте ошибку. На странице с ошибкой найдите, откуда django загружает шаблоны. Я имею в виду стек стека. В базе template_dir добавьте эти html-страницы 500.html, 404.html. При возникновении этих ошибок файлы шаблонов автоматически загружаются.

Вы также можете добавить страницы для других кодов ошибок, например 400 и 403.

Надеюсь на эту помощь!!!

Ответ 9

В 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 и обрабатываю ошибки всего сайта, контекстные процессоры в нем.

Ответ 10

Как одна строка (для 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)

Ответ 11

# 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 в папку шаблонов приложения.

Ответ 12

Попробуйте переместить шаблоны ошибок на .../Django/mysite/templates/?

Я уверен, что об этом, но я думаю, что они должны быть "глобальными" на веб-сайте.