(опубликовано как ответ, потому что комментарии, кажется, не поддерживают разрывы строк или другую разметку)
Спасибо за совет, у меня такое же чувство в отношении изменения атрибутов запроса. Должна быть причина, по которой в руководстве по Django указано, что их следует рассматривать только для чтения.
Я придумал это промежуточное ПО:
def process_request(self, request):
try:
obj = A.objects.get(src=request.path_info.rstrip('/')) #The alias record.
view, args, kwargs = resolve_to_func(obj.dst + '/') #Modified http://djangosnippets.org/snippets/2262/
request.path = request.path.replace(request.path_info, obj.dst)
request.path_info = obj.dst
request.META['PATH_INFO'] = obj.dst
request.META['ROUTED_FROM'] = obj.src
request.is_routed = True
return view(request, *args, **kwargs)
except A.DoesNotExist: #No alias for this path
request.is_routed = False
except TypeError: #View does not exist.
pass
return None
Но, учитывая возражения против изменения атрибутов запросов, не будет ли лучшим решением просто пропустить эту часть и добавить только части is_routed
и ROUTED_TO
(вместо перенаправленных из)?
Код, основанный на исходном пути, может затем использовать этот ключ из META.
Выполнение этого с помощью URLConfs невозможно, поскольку этот псевдоним предназначен для того, чтобы конечный пользователь мог настроить свои собственные URL-адреса, предполагая, что конечный пользователь не имеет доступа к базе кода или не знает, как написать свой собственный URLConf.
Хотя можно было бы написать функцию, которая преобразует файл, читаемый пользователем и редактируемый (например, XML), в действительные URL-адреса Django, создается впечатление, что использование записей в базе данных позволяет более динамически генерировать псевдонимы (другие объекты определяют свои собственные). псевдонимы).