Is there a way to programmatically add URL Patterns to Django without having to restart the server?
Or is there a way force Django to reprocess/cache URL patterns ( the URLconf )?
Is there a way to programmatically add URL Patterns to Django without having to restart the server?
Or is there a way force Django to reprocess/cache URL patterns ( the URLconf )?
如果您在没有代码预加载的情况下使用 gunicorn,只需向 gunicorn 主进程发送 HUP,它将生成加载新代码的新工作人员,并优雅地关闭旧工作人员,而不会丢失任何请求!
我通过破解一些东西来尝试这样的事情django.core.urlresolvers
- 它对我有用,但请注意这是一个hack。我还没有代码,但我做了这样的事情:
urlresolvers.get_resolver()
获取RegexURLResolver
负责解析 URL 的对象。传递None
给这个函数得到你的“根”URLConf。get_resolver()
_resolver_cache
为加载的 URLConfs使用缓存。_resolver_cache
应该强制 Django 重新创建一个干净的 URLResolver。或者,您可以尝试取消设置_urlconf_module
root 的属性RegexURLResolver
,这应该会强制 Django 重新加载它(虽然不确定,模块可能会被 Python 缓存)。
from urlresolvers import get_resolver
delattr(get_resolver(None), '_urlconf_module')
同样,不能保证这会起作用(我正在从我显然出于某种原因丢弃的代码的内存中工作)。但是 django/core/urlresolvers.py 绝对是您想要查看的文件。
编辑:决定对此进行一些试验,但没有奏效......
编辑2:
正如我所想,您的 URL 模块将被 Python 缓存。只需在它们更改时重新加载它们可能会起作用(使用reload
)。如果,您的问题是您正在urlpatterns
根据一些可能发生变化的数据动态构建。
我尝试reload
了我的根 URL(project.urls)和一个子 URL 模块(app.urls)。这就是我要显示的新 URL 所要做的所有事情get_resolver(None).url_patterns
所以诀窍可能很简单:手动重新加载您的 URL 模块。
这是你的答案:
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])
这接缝也是一种优雅的方式:
http://codeinthehole.com/writing/how-to-reload-djangos-url-config/
只需这样做即可重新加载您的根 urls 模块:
reload_urlconf()