有没有办法以编程方式将URL模式添加到Django而无需重新启动服务器?
或者有没有办法强制Django重新处理/缓存URL模式(URLconf)?
答案 0 :(得分:4)
如果您在没有代码预加载的情况下使用gunicorn,只需将HUP发送到gunicorn主进程,它将生成加载新代码的新工作者,并优雅地关闭旧代码,而不会丢失任何请求!
答案 1 :(得分:3)
我通过在django.core.urlresolvers
中删除一些内容来尝试这样的事情 - 它对我有用但请注意它是 hack 。我还没有代码,但我做了类似的事情:
urlresolvers.get_resolver()
来获取负责解析网址的RegexURLResolver
。将None
传递给此函数会获得“root”URLConf。get_resolver()
使用缓存_resolver_cache
来加载URLConfs。_resolver_cache
会强制Django重新创建一个干净的URLResolver。或者,您可能会尝试取消设置根_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])