是否有可能在Django项目中重新定义反向?

时间:2009-11-09 12:01:22

标签: python django decorator reverse monkeypatching

我有一些自定义逻辑需要在每次反转URL时执行,即使对于第三方应用也是如此。我的项目是一个多租户Web应用程序,并根据URL识别租户。没有一个有效的URL不包含租户标识符。

我已经有reverse的包装函数,但现在我需要一种方法来告诉每个已安装的应用程序使用它。 reverse周围的包装器使用线程本地将标识符注入到生成的URL中。我可以在reverse上将此函数编写为装饰器,但我不知道在哪里进行实际装饰。

适度坚定的约束:我已经在使用3个第三方应用,我可能会添加更多。解决方案不应要求我修改所有这些第三方应用的源代码。如果有更简单的方法,我不喜欢在多个第三方源树之上维护补丁的想法。我可以非常清楚地说明reverse已被装饰。

原始问题:我可以在哪里进行此类更改,以确保它适用于reverse的每次调用?

可能的替代问题:确保每个网址(包括第三方应用程序生成的网址)获取租户标识符的更好方法是什么? 顺便说一下,除了在URL中嵌入tenant-id之外,我还有更好的办法处理这些问题。这个决定现在已经很好了。感谢。

感谢。

1 个答案:

答案 0 :(得分:5)

只有这样才能将django reverse替换为ur_reverse

django.core.urlresolvers.reverse = ur_reverse

或者你喜欢decorator syntactic sugar

django.core.urlresolvers.reverse = ur_reverse_decorator(django.core.urlresolvers.reverse )
除非你不愿意用ur_reverse改变反向的每一种用法

,否则我不会建议(很多人都会喊)