В рабочем состоянии неверный URL-адрес показывает внутреннюю ошибку сервера вместо настроенного 404 [РЕШЕНО]

#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.. Но в производстве повышают внутреннюю ошибку сервера