Определите, будет ли при перенаправлении выдавать код состояния 404 перед перенаправлением - PullRequest
0 голосов
/ 06 января 2020

У меня есть система, в которой большая часть функциональности зависит от настройки сеанса ie, установленной пользователем. Естественно, с этим я разрешаю легко изменять этот сеанс (свойство), чтобы пользователь мог беспрепятственно просматривать новую информацию, когда она идет по всему приложению.

Например, пользователь просматривает единицы в системе, когда они выбирают новое свойство, отображаются единицы для нового выбранного свойства. Достаточно просто. Тем не менее, существует случай, когда пользователь просматривает юнит, и они изменяют свойство. Очевидно, что модуль, который они просматривают, больше не найден, поэтому страница 404.

Мне нужно знать, что перенаправление будет 404, поэтому я могу вместо этого перенаправить их на домашнюю страницу. Как я могу это сделать?

Каждый способ проверки (т.е. разрешение или HttpRespsonse) не показывает ошибку.

from urllib.parse import urlparse

import requests
from django.contrib import messages
from django.http import HttpResponse
from django.shortcuts import redirect, get_object_or_404
from django.urls import reverse, resolve, Resolver404

from apps.properties.models import Property

def set_property_session(request, property_id):

    redirect_url = request.META.get('HTTP_REFERER')
    # to check if it resolves, we must gather the path from the url
    path_to_check = urlparse(redirect_url).path
    try:
        # check to ensure the path resolves
        resolve(path_to_check)
        response = HttpResponse(path_to_check)
        # 200, not 404, when it should be while I am testing
        print(response.status_code)
        print(f'{path_to_check} is a valid path for redirection, we are going to go there in a sec...')
    except Resolver404:
        # error so go back home
        redirect_url = reverse('home', args=[client_url])
        print(f'{path_to_check} is not a valid path')
        return redirect(redirect_url)

    # 0 means the user wants to clear their session
    if property_id == 0:
        request.session['property'] = None
        Logger.info('property session set to none')
    else:
        # set the session to whichever property the user wants
        request.session['property'] = get_object_or_404(Property, pk=property_id)

    return redirect(redirect_url)


1 Ответ

0 голосов
/ 06 января 2020

Функция resolve только проверяет, является ли URL-адрес действительным, как определено в ваших правилах URL-адресов. Например, если URL Property будет выглядеть следующим образом

url(r'^property/(?P<id>[-\w.]+)', Property.as_view(), name='property')

или

path('property/<str:id>', Property.as_view(), name='property')

и у вас будет только один экземпляр Property с идентификатором 1, оба следующих URL будут разрешить, так как они являются действительными URL-адресами в соответствии с правилами:

property / 1

property / 4

Итак, в вашем коде resolve(path_to_check) всегда будет корректно разрешаться, поскольку HTTP_REFERER всегда будет действительным URL (если не изменен). response = HttpResponse(path_to_check) просто создает 200 см. Здесь , что означает, что в этот момент не будет выброшено Resolver404.

Я думаю, что единственный способ, которым вы можете "решить" это, чтобы обработать его внутри вашего представления и вместо этого вернуть перенаправление, или в этой функции, после того как вы получите свое свойство, проверьте, совпадают ли идентификаторы вашего свойства и устройства, и обработайте его соответствующим образом. Я вполне уверен, что вы можете использовать связанные объекты для обработки, как показано здесь

...