Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django项目中可以重新定义反向吗?_Python_Django_Decorator_Reverse_Monkeypatching - Fatal编程技术网

Python 在Django项目中可以重新定义反向吗?

Python 在Django项目中可以重新定义反向吗?,python,django,decorator,reverse,monkeypatching,Python,Django,Decorator,Reverse,Monkeypatching,我有一些自定义逻辑,需要在每次URL反转时执行,即使对于第三方应用程序也是如此。我的项目是一个多租户web应用程序,租户是根据URL识别的。没有一个有效的URL不包含租户标识符 我已经有了一个关于reverse的包装函数,但是现在我需要一种方法来告诉每个安装的应用程序使用它。reverse的包装器使用一个本地线程将标识符注入到结果URL中。我可以在反向上作为装饰器编写此函数,但我不知道在哪里进行实际装饰 适度严格的限制:我已经在使用3个第三方应用程序,我可能会添加更多。解决方案不应该要求我修改所

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

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

适度严格的限制:我已经在使用3个第三方应用程序,我可能会添加更多。解决方案不应该要求我修改所有这些第三方应用程序的源代码。如果有更简单的方法,我不喜欢在多个第三方源代码树上维护补丁。我可以在文档中非常清楚地说明,
reverse
已经过修饰

最初的问题是:我在哪里可以做出这样的更改,以保证它适用于
reverse
的每次调用

可能的替代问题:有什么更好的方法确保每个URL(包括由第三方应用程序生成的URL)都获得租户标识符? 顺便说一句,除了在URL中嵌入租户id之外,我愿意用一种更好的方法来处理这些问题;那项决定现在已经一成不变了。谢谢


谢谢。

只有这样,django倒档才会被ur_倒档取代

django.core.urlresolvers.reverse = ur_reverse
或者如果你喜欢装饰糖

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

我不会建议(很多人会大喊大叫),除非你不愿意用你的反转来改变反转的每一个用法

简单地把每一个
反转
修改成
你的特别的反转
有什么错?为什么不使用grep并修复每一个事件,而不是让你的代码的未来读者感到困惑呢?我需要每个第三方应用程序都使用
your\u special\u reverse
,我不想使用每个第三方应用程序。我第一次在django通知中遇到这个问题,但我预见到其他应用程序也会出现问题。“每一个第三方应用程序”?你说的第三方应用数量是多少?我最多有3个,而且我还看到了3个看起来很适合我的项目的应用。因为没有第三方应用知道其他应用,你在做什么可能的“反向”润色?这是不是用TemplateContext做得更好?这很有效。。。即使你升级了django,它也很可能继续工作:)…即使你是在蒙基修补django,这仍然是他的问题的答案。我知道我想装饰
反向
。我的问题是我应该在哪里做装饰?我的解决方案你可以应用在设置中,或任何其他地方。我担心在
settings.py中执行此操作可能会由于初始化不完整而导致某种微妙的错误。