2009-11-09 11 views
3

J'ai une logique personnalisée qui doit être exécutée chaque fois qu'une URL est inversée, même pour des applications tierces. Mon projet est une application Web multitenant, et le locataire est identifié en fonction de l'URL. Il n'y a pas une seule URL valide qui n'inclut pas un identifiant de locataire.Est-il possible de redéfinir l'inverse dans un projet Django?

J'ai déjà une fonction wrapper autour de reverse, mais maintenant j'ai besoin d'un moyen de dire à chaque application installée de l'utiliser. L'enveloppe autour de reverse utilise un thread local pour injecter l'identifiant dans l'URL résultante. Je pourrais écrire cette fonction en tant que décorateur sur reverse, mais je ne sais pas où faire la décoration réelle.

Contrainte modérément ferme: J'utilise déjà 3 applications tierces, et j'y ajouterai probablement plus. Une solution ne devrait pas exiger de moi de modifier le code source de toutes ces applications tierces. Je n'apprécie pas l'idée de maintenir des correctifs au-dessus de plusieurs arbres sources de tierces parties s'il y a un moyen plus facile. Je peux rendre la documentation abondamment claire que reverse a été décoré.

La question originale: Où pourrais-je faire un tel changement qui garantit qu'il s'appliquerait à chaque invocation de reverse?

Autre question possible: Quelle est la meilleure façon de s'assurer que chaque URL, y compris celles générées par des applications tierces, obtient l'identifiant du locataire? BTW, je suis ouvert à une meilleure façon de gérer tout cela, sauf l'intégration de l'ID de locataire dans l'URL; cette décision est assez sombre dans la pierre en ce moment. Merci.

Merci.

+0

Qu'est-ce qui ne va pas avec la simple révision de chaque 'reverse' à' your_special_reverse'? Pourquoi ne pas utiliser grep et corriger chaque occurrence plutôt que de confondre les futurs lecteurs de votre code? –

+0

J'ai également besoin de toutes les applications tierces pour utiliser 'your_special_reverse', et je ne veux pas utiliser toutes les applications tierces que j'utilise. J'ai d'abord rencontré ce problème avec django-notification, mais je prévois que ce soit un problème avec d'autres applications. –

+0

"chaque application tierce"? De quel volume d'applications tierces parlez-vous? –

Répondre

5

seule façon pour que inverse django est remplacé par ur_reverse est

django.core.urlresolvers.reverse = ur_reverse 

ou si vous aimez décorateur sucre syntaxique

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

que je ne conseils (et beaucoup crierai), à moins que vous ne sont pas prêts à changer toutes les utilisations de reverse avec ur_reverse

+0

Cela fonctionne ... et est susceptible de continuer à fonctionner même si vous mettez à jour django :) – Jiaaro

+0

... même si vous monkeypatching django, c'est toujours la réponse à sa question – Jiaaro

+0

Je suis conscient que je veux décorer 'reverse' .Ma question est * où * je devrais faire la décoration? –