2011-02-01 4 views
10

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

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

+1

Вы используете 'mod_wsgi'? Если это так, вы можете перезапустить приложение, не перезагружая весь сервер Apache. –

+0

@ S.Lott для производственного сервера да, так что это может сработать, как перезапустить конкретное приложение? Есть ли что-то подобное для dev-сервера? –

+0

@ S.Lott, для 'dev server' я имею в виду сервер разработки buit-in, который поставляется с Django, например: python manage.py runningerver. Возможно, я неправильно понял ваш первый комментарий, предположили ли вы, что можно перезапустить одно приложение Django без перезапуска других приложений или вы предлагаете перезапустить приложения Django/All без перезапуска Apache? Мне нужно было сделать первое. –

ответ

3

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

3

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

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

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

from urlresolvers import get_resolver 

delattr(get_resolver(None), '_urlconf_module') 

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

EDIT: Решил поэкспериментировать некоторые с этим, и это не сработало ...

EDIT2:

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

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

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

+0

Когда я получу шанс, я буду играть с этим и посмотреть, работает ли он. –

 Смежные вопросы

  • Нет связанных вопросов^_^