Django дает 500 вместо 404 для неизвестных URL, когда отладка ложна - PullRequest
0 голосов
/ 04 ноября 2019

Django = 2.1.x

Python = 3.7.x

Если отладка истинна - возвращает 404.

Если отладка ложна - выдает 500ошибка.

Мой project.urls файл выглядит так:

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", app1.views.log_in, name="log_in"),
    path("log_in/", app1.views.log_in, name="log_in"),
    path("logout/", app1.views.log_out, name="logout"),
    path("launcher/", app1.views.launcher, name="launcher"),
    path("app2/", include("app2.urls")),
    path("app3/", include("app3.urls")),
]

Моя структура каталогов выглядит так:

Project_directory
    static_directory
        ...js files and css files and such...
    templates_directory
        400.html
        403.html
        404.html
        500.html
        base.html (all apps extend this page, which works great)
    project_directory
        urls.py
        settings.py
        ...other files...
    app1_directory
        views.py
        models.py
        templates_directory
            app1
                ...template files...
        ...other app1 files/directories...
    app2_directory
        ...app2 directories and files...
    app3_directory
        ...app3 directories and files...

Когда я python manage.py runserver и я нажимаюURL, который я знаю, не существует (например, http://project/randomtrash.php), он выдает соответствующие 404, если DEBUG = True

Если DEBUG = False, то нажатие на этот же URL даст 500 и отображение 500.html

Важные части моего settings.py выглядят так:

# These two settings are only for testing purposes and are different
# In production
DEBUG = False
ALLOWED_HOSTS = ["*"]

ROOT_URLCONF = "project.urls"

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        # DIRS lets the apps extend base.html
        "DIRS": [os.path.join(BASE_DIR, "templates")],
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
                "project.context_processors.app_context",
                "project.context_processors.registrations",
            ]
        },
    }
]

STATIC_URL = "/static/"

STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static")

SESSION_EXPIRE_AT_BROWSER_CLOSE = True

if DEBUG:
    STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Это было связано с app_context и registrations context_processors.

В тех, которые они использовали request и разрешали вещи против него (то есть resolve(request.path).app_name), которые никогда не будут совпадать с404 или другая ошибка - таким образом, вызывая ошибку 500 в ответе.

Я обернул каждую из этих парных функций в ее собственный простой оператор if:

if request.resolver_match:
    ...do stuff...

Теперь все ошибки отображаются правильно, как и ожидалось.

0 голосов
/ 04 ноября 2019

Django отображает страницу отладки, когда DEBUG = True, игнорируя страницу 404.

См. Показать страницу 404 на django, когда DEBUG = True

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...