У меня есть система, в которой большая часть функциональности зависит от настройки сеанса 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)