2009-11-09 4 views
3

У меня есть пользовательская логика, которая должна выполняться каждый раз, когда URL-адрес отменяется, даже для сторонних приложений. Мой проект - это многопользовательское веб-приложение, и арендатор идентифицируется на основе URL-адреса. Не существует ни одного действительного URL-адреса, который не включает идентификатор арендатора.Можно ли переопределить реверс в проекте Django?

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

Умеренно Фирменная Ограничение: Я уже использую 3 сторонних приложения, и я, вероятно, добавлю больше. Решение не должно требует от меня изменить исходный код всех этих сторонних приложений. Мне не нравится идея сохранения патчей поверх нескольких исходных деревьев сторонних разработчиков, если есть более простой способ. Я могу сделать документацию совершенно ясно, что был оформлен reverse.

Оригинальный вопрос: Где я могу сделать такое изменение, которое гарантирует его применение к каждому вызову reverse?

Возможный альтернативный вопрос: Какой лучший способ убедиться, что каждый URL-адрес, в том числе созданные сторонними приложениями, получает идентификатор арендатора? BTW, я открыт для лучшего способа обработки любого из этого, кроме вложения идентификатора арендатора в URL-адрес; это решение довольно точно установлено в камне прямо сейчас. Благодарю.

Спасибо.

+0

Что не так, просто пересматривая каждый 'обратный' на' your_special_reverse'? Почему бы не использовать grep и не исправлять все случаи, а не путать будущих читателей вашего кода? –

+0

Мне нужно, чтобы все сторонние приложения использовали 'your_special_reverse', и я не хочу разворачивать каждое стороннее приложение, которое я использую. Я впервые столкнулся с этой проблемой с уведомлением django, но я предвижу, что это проблема с другими приложениями. –

+0

"каждое стороннее приложение"? О каком объеме сторонних приложений вы говорите? –

ответ

5

единственный путь, так что Джанго обратный заменяется ur_reverse является

django.core.urlresolvers.reverse = ur_reverse 

или, если вам нравится декоратора синтаксический сахар не

django.core.urlresolvers.reverse = ur_reverse_decorator(django.core.urlresolvers.reverse) 

, которые я бы не совет (и многие будут кричать), если вам не желают менять каждое использование обратного с ur_reverse

+0

Это работает ... и, скорее всего, продолжит работу даже при обновлении django :) – Jiaaro

+0

... даже если вы обезьянчак django, это все еще ответ на его вопрос – Jiaaro

+0

Я знаю, что хочу украсить 'reverse' ,Мой вопрос: где я должен делать украшение? –

Смежные вопросы