Django: handler403 не работает, но 404 работает - PullRequest
0 голосов
/ 22 января 2019

Вот содержимое MyProj / urls.py :

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('general.urls')), # Main app
]

handler403 = 'general.views.handler403'
handler404 = 'general.views.handler403'

Как видите, оба обработчика указывают на одно и то же представление, а первое, которое мне больше всего нужно, не работает! Например, данные другого пользователя на /obj/12 показывают страницу браузера 403 по умолчанию:

[22 / Jan / 2019 08:39:14] "GET / obj / 12 HTTP / 1.1" 403 0

Но второй работает хорошо и показывает правильную страницу (при попытке доступа к некоторым несуществующим данным в /obj/768). Почему и как я могу это решить?

Режим отладки выключен. Моя версия Django - 2.0.6

Update.

Содержимое файла handler403.py :

from django.shortcuts import render_to_response

def handler403(request, *args, **argv):
    print('Handler 403 was called!')
    u = request.user
    params = {
        'user': u,
    }
    response = render_to_response('403.html', params)
    response.status_code = 403
    return response

Строка Handler 403 was called! никогда не печатается, когда я пытаюсь получить эту страницу.

Ответы [ 3 ]

0 голосов
/ 22 января 2019

handler403 должен указывать на представление

Попробуйте что-то вроде этого:

from general.views.handler403 import handler403

handler403 = handler403
0 голосов
/ 22 января 2019

Я предполагаю, что ваши представления возвращают django.http.HttpResponseForbidden вместо того, чтобы вызывать исключение django.core.exceptions.PermissionDenied.

Только исключение PermissionDenied обрабатываетсяhandler403, HttpResponseForbidden возвращается как есть.

0 голосов
/ 22 января 2019

Если это действительно ваш обработчик403 файл (он же handler403.py), вы, вероятно, захотите

handler403 = 'general.views.handler403.handler403'

(поэтому пунктирный путь к фактическому вызываемому элементу).

...