11

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 )?

4

4 回答 4

4

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

于 2011-02-01T22:45:35.947 回答
3

我通过破解一些东西来尝试这样的事情django.core.urlresolvers- 它对我有用,但请注意这是一个hack。我还没有代码,但我做了这样的事情:

  1. Django 通常用于urlresolvers.get_resolver()获取RegexURLResolver负责解析 URL 的对象。传递None给这个函数得到你的“根”URLConf。
  2. get_resolver()_resolver_cache为加载的 URLConfs使用缓存。
  3. 重置_resolver_cache应该强制 Django 重新创建一个干净的 URLResolver。

或者,您可以尝试取消设置_urlconf_moduleroot 的属性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 模块。

于 2011-02-01T23:03:48.240 回答
2

这是你的答案:

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])
于 2019-08-03T14:20:57.940 回答
1

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

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

只需这样做即可重新加载您的根 urls 模块:

reload_urlconf()
于 2014-01-06T14:12:01.163 回答