Программно отключить ОТЛАДКУ в команде Django

#django #memory-management

#django #управление памятью

Вопрос:

Я использую пользовательскую команду Django для генерации XML-карт сайта для сайта с примерно 3-4 миллионами записей данных ( ./manage.py generate_sitemaps ). Кажется, это работает, но съедает слишком много памяти, когда DEBUG включено в settings.py.

Обычно у меня включена DEBUG опция во время разработки, и я часто забываю отключить ее перед началом создания sitemap. Если это произойдет, память начнет заполняться до тех пор, пока скрипт не завершит работу примерно через 2-3 часа. Очень раздражает.

Есть ли способ временно отключить настройку отладки для выполнения команды Django? Я думал импортировать модуль настроек и переопределить параметр, но я не думаю, что это сработает.

Комментарии:

1. Возможен ли перезапуск вашего сервера? Если это так, вы могли бы использовать sed, чтобы установить DEBUG = Off, перезагрузить свой сервер и после этого снова включить DEBUG …

2. Это команда Django, для которой не нужен работающий сервер. Я могу изменить настройку, запустить ее и изменить обратно, но это именно то, что я слишком ленив, чтобы делать. Если бы был способ переопределить это из моего скрипта, это было бы здорово.

Ответ №1:

Я думаю, у вас здесь есть пара вариантов:

  1. Импортируйте настройки и выдайте сообщение об ошибке, чтобы напомнить себе отключить отладку.

  2. Используйте --settings= и установите это значение равным файлу (например gen_settings.py ) файл специально для вашей команды generate_sitemaps , где DEBUG=False . Затем создайте псевдоним для ./manage.py generate_sitemaps --settings=gen_settings

http://docs.djangoproject.com/en/dev/topics/settings / специально предупреждает, чтобы не изменять настройки во время выполнения

Я уже использовал второй вариант раньше, и он работал довольно хорошо. Лучше, чем раздражаться через 2-3 часа =)

Комментарии:

1. Интересно, относится ли предупреждение не изменять настройки во время выполнения в документах только к веб-серверам (возможно, из-за проблем с потоками и т.д.) У меня есть неподдерживаемая догадка, что это может быть менее проблематично для команд управления.

Ответ №2:

Я не совсем уверен, что это вам поможет, но вы можете попробовать:

 from django.conf import settings

tmp = settings.DEBUG
settings.DEBUG = False
# some your actions
# ...
# ...
settings.DEBUG = tmp
  

В качестве альтернативы вы можете использовать отдельный файл настроек и установить его в командной строке следующим образом

 ./manage.py your_command --settings=another_settings.py
  

И в этом another_settings.py:

 from .settings import *
DEBUG = False
  

Комментарии:

1. Я не думаю, что первое решение сработает, но второй подход выглядит интересным 🙂