Есть ли способ программно добавить шаблоны URL в Django, не перезагружая сервер?Программно добавлять шаблоны URL в Django?
Или есть способ заставить Django обрабатывать/кэшировать URL-шаблоны (URLconf)?
Есть ли способ программно добавить шаблоны URL в Django, не перезагружая сервер?Программно добавлять шаблоны URL в Django?
Или есть способ заставить Django обрабатывать/кэшировать URL-шаблоны (URLconf)?
Если вы используете пушечную стрельбу без предварительной загрузки кода, просто отправьте HUP в мастер-процесс пушки, это вызовет новых рабочих, которые загружают новый код и изящно закрывают старые, без единого потерянного запроса!
Я пробовал что-то вроде этого, взломав некоторые вещи в django.core.urlresolvers
- это сработало для меня, но обратите внимание, что это hack. Я до сих пор не имеют код, но я сделал что-то вроде этого:
urlresolvers.get_resolver()
, чтобы получить RegexURLResolver
, который отвечает за разрешение URL. Передача None
этой функции получает ваш «root» URLConf.get_resolver()
использует кеш, _resolver_cache
, для загруженных URLConfs._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-адрес.
Когда я получу шанс, я буду играть с этим и посмотреть, работает ли он. –
Это швы также элегантный способ сделать это:
http://codeinthehole.com/writing/how-to-reload-djangos-url-config/
Просто делать, что перезагрузить модуль корневые URLs:
reload_urlconf()
Вы используете 'mod_wsgi'? Если это так, вы можете перезапустить приложение, не перезагружая весь сервер Apache. –
@ S.Lott для производственного сервера да, так что это может сработать, как перезапустить конкретное приложение? Есть ли что-то подобное для dev-сервера? –
@ S.Lott, для 'dev server' я имею в виду сервер разработки buit-in, который поставляется с Django, например: python manage.py runningerver. Возможно, я неправильно понял ваш первый комментарий, предположили ли вы, что можно перезапустить одно приложение Django без перезапуска других приложений или вы предлагаете перезапустить приложения Django/All без перезапуска Apache? Мне нужно было сделать первое. –