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 и это вызывало проблему
Ответы
Ответ 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/
?
Я уверен, что об этом, но я думаю, что они должны быть "глобальными" на веб-сайте.
Ответ 13
Я нашел все, что мне было нужно здесь: https://docs.djangoproject.com/en/2.1/topics/http/views/#customizing-error-views