#python #django #django-views
Вопрос:
Я создал простой обработчик 404 в соответствии с документацией. В локальном это работает нормально, например, когда пользователь пытается получить доступ к URL-адресу, который не существует, вызывается обработчик ошибки 404. Но в производстве это показывает классическую «Внутреннюю ошибку сервера», и я не могу понять, почему.
Обработчиком являются эти:
view.py
:
def handler500(request):
context = {}
return render(request, "maintenance/error500.html", status=500)
def handler404(request, exception):
context = {}
return render(request, "maintenance/error404.html", status=404)
В urls.py
я добавляю следующие строки для вызова правильного обработчика:
urls.handler500 = views.handler500
urls.handler404 = views.handler404
(Я установил DEBUG=False)
Я думал, что ошибка возникла до того, как позвонил handler404, но почему в локальной она работает, а в производственной нет?
error404.html
{% extends "portal/base.html" %}
{% load i18n %}
{% block css %}
<style>
.on-error-hide {
display:none;
}
</style>
{% endblock %}
{% block page_header %}
<nav id="header-bar" class="navbar gray">
<div class="container">
<div class="row">
<a id="logo_gray" href="{% url 'home' %}" class="col-3"></a>
</div>
</div>
</nav>
{% endblock %}
{% block breadcrumbs %}
<li class="error"><span>{% translate "PAGE NOT FOUND" %}</span></li>
{% endblock %}
{% block content %}
<div class="alert alert-danger w-100" role="alert">
<p>{% translate "The requested page was not found on this server." %}</p>
<p>{% translate "This error occurs because the page you are requiring does not exist or has been deleted." %}</p>
<p>{% translate "Please check that the url you entered is correct." %}</p>
<p>{% translate "If you want to return to the home page, please click " %}<a href="{% url 'home' %}" style="color:#721c24;">{% translate "here" %}</a></p>
</div>
{% endblock %}
Редактировать:
Из журнала а я получил это, в чем смысл?
GET /session/987567865850/ HTTP/1.1" 500 141 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:92.0) Gecko/20100101 Firefox/92.0
решение:
Я решил проблему, создав класс промежуточного программного обеспечения, который обрабатывает исключение 404.
class Custom404Middleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_exception(self, request, exception):
if isinstance(exception, Http404):
return render(request, "maintenance/error404.html", status=404)
Заранее спасибо за предложения!
Комментарии:
1. я думаю, вы можете просто добавить в свои шаблоны 404.html и 500.html. вам не нужны представления или URL-адреса, которые должны обрабатывать that.at по крайней мере, для меня это прекрасно работает, когда debug=False даже в производстве.
2. На самом деле я не могу понять, почему для меня, на производстве, это не работает… В локальном он отлично работает с Debug=False, он загружается 404.html или 500.html.. Но в производстве повышают внутреннюю ошибку сервера