Есть способ добавить функции к существующей команде django?

Я хочу запустить команду непосредственно перед запуском команды django.

Например:

$ python manage.py runserver Validating models... 0 errors found Django version 1.3, using settings 'creat1va.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C. (started some command in the background) [10/Jul/2011 21:50:26] "GET / HTTP/1.1" 200 1611 [10/Jul/2011 21:50:26] "GET /assets/css/master.css HTTP/1.1" 404 1783 [10/Jul/2011 21:50:26] "GET /assetshttp://img.rupython.com/pythonmisc/logo.png HTTP/1.1" 404 1801 [10/Jul/2011 21:50:26] "GET /assetshttp://img.rupython.com/pythonicons/bo.gif HTTP/1.1" 404 1798 [10/Jul/2011 21:50:28] (My background process) "Some nice Feedback" 

Основная идея – начать фоновый процесс и вывести журнал.

Есть ли способ достичь этого, не взламывая источники django?

3 Solutions collect form web for “Есть способ добавить функции к существующей команде django?”

Просто поймите, что вы можете легко отменить команды так же, как приложение с командой с тем же именем.

Поэтому я создаю приложение и создаю файл с тем же именем, что и runerver, а затем расширяет базовый класс сервера запуска, чтобы добавить новую функцию до ее запуска.

Например, я хочу запустить команду $ compass watch, как раз перед запуском запуска сервера и продолжением его выполнения по исполнению сервера.

 """ Start $compass watch, command when you do $python manage.py runserver file: main/management/commands/runserver.py Add ´main´ app to the last of the installed apps """ from optparse import make_option import os import subprocess from django.core.management.base import BaseCommand, CommandError from django.core.management.commands.runserver import BaseRunserverCommand from django.conf import settings class Command(BaseRunserverCommand): option_list = BaseRunserverCommand.option_list + ( make_option('--adminmedia', dest='admin_media_path', default='', help='Specifies the directory from which to serve admin media.'), make_option('--watch', dest='compass_project_path', default=settings.MEDIA_ROOT, help='Specifies the project directory for compass.'), ) def inner_run(self, *args, **options): self.compass_project_path = options.get('compass_project_path', settings.MEDIA_ROOT) self.stdout.write("Starting the compass watch command for %r\n" % self.compass_project_path) self.compass_pid = subprocess.Popen(["compass watch %s" % self.compass_project_path], shell=True, stdin=subprocess.PIPE, stdout=self.stdout, stderr=self.stderr) self.stdout.write("Compas watch process on %r\n" % self.compass_pid.pid) super(Command, self).inner_run(*args, **options) 

Это прекрасно работает.

Посмотрите https://docs.djangoproject.com/en/dev/howto/custom-management-commands/ для получения дополнительной информации о командах django

Надеюсь, что кто-то найдет это полезным

Чтобы продолжить расширение превосходного ответа @Mario César, я хотел бы представить современную версию своего исходного кода 2011 года, адаптированного для Django 1.8+:

Перед Django 1.8 команды управления были основаны на модуле optparse […] Теперь, когда команды управления используют argparse для разбора аргументов, все аргументы передаются по ** параметрам по умолчанию […]

Источник

Кроме того, я хотел бы указать, что конкретный командный runserver который был выбран в вопросе, имеет небольшое усложнение, что делает его хорошим и плохим примером.

Плохой пример, потому что усложнение заключается в том, что команда также переопределяется самим Django. Действительно, Django использует тот же метод, что и предложенный Марио: Django переопределяет его в приложении staticfiles (см. Код Django в github ), чтобы предлагать дополнительные параметры статических файлов.

Поэтому лучше переопределить команду приложения staticfiles, а не команду ядра, если использовать статическую. Это также отвечает на комментарий @ ts_pati о том, почему существует проблема. Код Django staticfiles – хороший пример того, как его переопределить, но на этот раз импортировать статические файлы, чтобы не потерять эту функциональность:

 from django.contrib.staticfiles.management.commands.runserver import Command as StaticfilesRunserverCommand class Command(StaticfilesRunserverCommand): help = "Starts a lightweight Web server for development, serves static files and does some custom fancy stuff." def add_arguments(self, parser): super(Command, self).add_arguments(parser) parser.add_argument('--my-custom-argument', action="...", dest='my_custom_handler', default=True, help='do some stuff in fancy ways') def get_handler(self, *args, **options): """ My fancy stuff function. """ handler = super(Command, self).get_handler(*args, **options) my_custom_handler = options.get('my_custom_handler', True) # do stuff here return handler 

EDIT: Я также хотел бы добавить порядок этого в INSTALLED_APPS по-видимому, важно, и это должно быть до django.contrib.staticfiles .

Напишите свою собственную команду управления в своем приложении, которое запускает вашу команду, а затем вызывает встроенную реализацию Django.

  • СУХОЙ способ добавления созданных / модифицированных и временных
  • Насколько медленны исключения Python / django?
  • Django SECRET_KEY
  • Документация типа Django filter ()
  • Django, ошибки UserChangeForm
  • Как автоматически уничтожить базу данных тестирования django
  • Персонализированные транзакции в Django
  • Ошибка «Невозможно назначить / должна быть экземпляром» при создании экземпляра модели из CSV (связанного с ForeignKey)
  • страшная «не такая же ошибка объекта», пробирая объект queryset.query
  • Счетчик комментариев Django с отдельным полем
  • Python - Pytz - Список часовых поясов?
  • Python - лучший язык программирования в мире.