以编程方式在Django中添加URL模式?

时间:2011-02-01 18:56:05

标签: python django django-admin django-urls django-settings

有没有办法以编程方式将URL模式添加到Django而无需重新启动服务器?

或者有没有办法强制Django重新处理/缓存URL模式(URLconf)?

4 个答案:

答案 0 :(得分:4)

如果您在没有代码预加载的情况下使用gunicorn,只需将HUP发送到gunicorn主进程,它将生成加载新代码的新工作者,并优雅地关闭旧代码,而不会丢失任何请求!

答案 1 :(得分:3)

我通过在django.core.urlresolvers中删除一些内容来尝试这样的事情 - 它对我有用但请注意它是 hack 。我还没有代码,但我做了类似的事情:

  1. Django通常使用urlresolvers.get_resolver()来获取负责解析网址的RegexURLResolver。将None传递给此函数会获得“root”URLConf。
  2. get_resolver()使用缓存_resolver_cache来加载URLConfs。
  3. 重置_resolver_cache会强制Django重新创建一个干净的URLResolver。
  4. 或者,您可能会尝试取消设置根_urlconf_module的{​​{1}}属性,这会强制Django重新加载它(虽然不确定,但是模块可能会被Python缓存) )。

    RegexURLResolver

    再一次,不能保证这会起作用(我是从代码那里开始工作的,因为某些原因我已经放弃了)。但是django / core / urlresolvers.py肯定是你想看的文件。

    编辑:决定对此进行一些实验并且无效......

    <强> EDIT2:

    正如我所想,您的URL模块将由Python缓存。只需在更改时重新加载它们就可以工作(使用from urlresolvers import get_resolver delattr(get_resolver(None), '_urlconf_module') )。如果,您的问题是您根据可能发生变化的某些数据动态构建reload

    我尝试urlpatterns我的根URL(project.urls)和一个郊区模块(app.urls)。这就是我要为reload

    显示的新网址所做的一切

    所以诀窍可能就是这么简单:手动重新加载你的URL模块。

答案 2 :(得分:1)

这种接缝也是一种优雅的方式:

http://codeinthehole.com/writing/how-to-reload-djangos-url-config/

只需重新加载根网址模块:

reload_urlconf()

答案 3 :(得分:0)

这是您的答案:

import sys
from django.conf import settings
from importlib import reload
from django.urls import clear_url_caches

urlconf = settings.ROOT_URLCONF
  if urlconf in sys.modules:
      clear_url_caches()
      reload(sys.modules[urlconf])