Программно добавлять шаблоны URL в Django? - PullRequest
10 голосов
/ 01 февраля 2011

Есть ли способ программно добавить шаблоны URL в Django без перезагрузки сервера?

Или есть ли способ заставить Django перерабатывать / кэшировать шаблоны URL (URLconf)?

Ответы [ 3 ]

4 голосов
/ 02 февраля 2011

Если вы используете gunicorn без предварительной загрузки кода, просто отправьте HUP мастер-процессу gunicorn, он вызовет новых рабочих, которые загрузят новый код, и изящно закроет старые без единого потерянного запроса!

3 голосов
/ 02 февраля 2011

Я попробовал что-то подобное, взломав некоторые вещи в django.core.urlresolvers - у меня это сработало, но учтите, что это хак . У меня до сих пор нет кода, но я сделал что-то вроде этого:

  1. Django обычно использует urlresolvers.get_resolver() для получения RegexURLResolver, который отвечает за разрешение URL-адресов. Передача None этой функции возвращает ваш «корневой» URLConf.
  2. get_resolver() использует кэш _resolver_cache для загруженных URLConfs.
  3. Сброс _resolver_cache должен заставить Django воссоздать чистый URLResolver.

В качестве альтернативы вы можете попытаться сбросить атрибут _urlconf_module корня RegexURLResolver, что должно заставить Django перезагрузить его (хотя и не уверен в этом, возможно, модуль будет кэшироваться Python).

from urlresolvers import get_resolver

delattr(get_resolver(None), '_urlconf_module')

Опять же, не гарантируется, что это будет работать (я работаю из памяти из кода, который я по какой-то причине явно отбросил). Но django / core / urlresolvers.py - это определенно файл, который вы хотите просмотреть.

РЕДАКТИРОВАТЬ: Решил поэкспериментировать с этим, и это не сработало ...

EDIT2:

Как я и думал, ваши модули URL будут кэшироваться Python. Простая перезагрузка их по мере их изменения может работать (используя reload). Если, ваша проблема в том, что вы динамически создаете urlpatterns на основе некоторых данных, которые могут измениться.

Я попытался reload использовать мои корневые URL-адреса (project.urls) и модуль suburl (app.urls). Это все, что мне нужно было сделать, чтобы новые URL отображались get_resolver(None).url_patterns

Так что хитрость может быть такой простой: перезагрузите модуль URL вручную.

1 голос
/ 06 января 2014

Это также элегантный способ сделать это:

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

Просто сделайте это, чтобы перезагрузить модуль корневых URL:

reload_urlconf()
...