【问题标题】:Is it possible to monkey patch Django's reverse?是否可以对 Django 进行反向修补?
【发布时间】:2018-01-19 21:57:28
【问题描述】:

我们的一些网址包括#。这些用于反向查找,都使用reverse{% url 模板标签(内部使用reverse)。 Django 1.8 过去不理会它,1.11 现在将其编码为%23

是否可以在某处放置一个猴子补丁包装器并在任何地方使用它而不会失败?这是我的包装:

def patch_reverse(func):
    def inner(*args, **kwargs):
        print "inner reverse"
        url = func(*args, **kwargs)
        return url.replace("%23", "#")

    return inner


from django.urls import base
base.reverse = patch_reverse(base.reverse)

print 语句是为了让我可以查看它是否真的在运行。

我已尝试将其放入设置中,即第一个安装的应用程序的__init__,以及第一个安装的应用程序的urls。没有任何效果。

【问题讨论】:

    标签: python django monkeypatching


    【解决方案1】:

    当您修补 reverse 时,原始函数可能已经导入到 django.urls(您通常从中导入它)和 django.template.defaulttags{% url %} 标签使用它的位置。尝试修补它在这些模块中:

    import django.urls
    django.urls.reverse = patch_reverse(django.urls.reverse)
    
    import django.template.defaulttags
    django.template.defaulttags = patch_reverse(django.template.defaulttags)
    

    【讨论】:

    • 它甚至无法在 ./manage.py shell 中工作。是否有一些我可以修补的原始模块的动态源重新加载?
    • manage.py shell 中修补django.urls.reverse 对我有用。
    【解决方案2】:

    这行得通。在您的 settings.py 或等效设置模块中:

    from django import urls
    from django.core import urlresolvers
    
    _django_reverse = urlresolvers.reverse
    
    
    def _reverse(*args, **kwargs):
        result = _django_reverse(*args, **kwargs)
        # Do whatever you want to do to reverse here
        return result.replace("%23", "#")
    
    
    urlresolvers.reverse = _reverse
    urls.reverse = _reverse
    

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 2016-01-16
      • 2016-10-12
      • 1970-01-01
      • 2010-10-23
      • 2010-09-27
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多