【问题标题】:Is it possible to redefine reverse in a Django project?是否可以在 Django 项目中重新定义反向?
【发布时间】:2010-12-14 14:35:51
【问题描述】:

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

我已经有一个围绕reverse 的包装函数,但现在我需要一种方法来告诉每个已安装的应用程序都使用它。 reverse 的包装器使用线程本地将标识符注入结果 URL。我可以在reverse 上写这个函数作为装饰器,但我不知道在哪里做实际的装饰。

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

最初的问题:我在哪里可以进行这样的更改以保证它适用于reverse 的每次调用?

可能的替代问题:确保每个 URL(包括由 3rd 方应用程序生成的 URL)获取租户标识符的更好方法是什么? 顺便说一句,除了在 URL 中嵌入租户 ID 之外,我愿意采用更好的方法来处理任何这些问题;这个决定现在已经很确定了。谢谢。

谢谢。

【问题讨论】:

  • 简单地将每个reverse 修改为your_special_reverse 有什么问题?为什么不使用 grep 并修复所有出现的问题,而不是让您的代码的未来读者感到困惑?
  • 我也需要每个第三方应用程序都使用your_special_reverse,并且我不想分叉我使用的每个第三方应用程序。我首先在 django-notification 中遇到了这个问题,但我预见到其他应用程序也会出现这个问题。
  • “每个第三方应用程序”?您指的是多少第三方应用?
  • 我已经 3 岁了,而且我还看到了大约 3 个看起来很适合我的项目。
  • 由于没有第三方应用程序知道任何其他应用程序,您在做什么可能的“反向”修饰?使用 TemplateContext 会更好吗?

标签: python django decorator reverse monkeypatching


【解决方案1】:

让 django reverse 被 ur_reverse 替换的唯一方法是

django.core.urlresolvers.reverse = ur_reverse

或者如果你喜欢装饰器语法糖

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

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

【讨论】:

  • 这行得通...并且即使在您升级 django 时也可能继续工作:)
  • ...即使你是猴子补丁 django,它仍然是他问题的答案
  • 我知道我想装饰reverse。我的问题是我应该在哪里装修?
  • 我的解决方案,您可以在设置中应用一次,或在其他任何地方应用一次
  • 谢谢。我担心在settings.py 中这样做可能会由于初始化不完整而导致某种微妙的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多