Как запустить команду управления в django views.py

Я собираюсь использовать django-dbbackup в своем текущем приложении. Моя задача - сделать резервную копию моей последней базы данных sqlite3 с custom_name.db, когда кнопка «Резервное копирование базы данных» нажата из пользовательского интерфейса, и восстановить резервную копию из списка существующих резервных копий, когда нажата «Восстановить эту резервную копию».

В django-dbbackup есть две команды управления, dbbackup и dbrestore, которые используются как

dbbackup [-s <servername>] [-d <database>] [--clean] [--compress] [--encrypt]

и

dbrestore [-d <database>] [-s <servername>] [-f <localfile>]

Теперь мой вопрос: если у меня есть исходное имя базы данных original_db.db, и я хочу сделать резервную копию этой базы данных, переименовав ее в db_current_data_time.db, какими должны быть методы views.py?


person Rafiul Sabbir    schedule 04.11.2013    source источник


Ответы (2)


Вы можете вызывать команды, запущенные manage.py, используя call_command.

from django.core import management
management.call_command('your_command', your_options)

Таким образом, в соответствующих представлениях резервного копирования и восстановления вы можете вызывать свои команды.

person Rohan    schedule 04.11.2013
comment
Спасибо за ответ. Могу ли я просто вызвать команду, используя management.call_command() в методе views.py? - person Rafiul Sabbir; 05.11.2013
comment
@iamrafiul, да. Но это заблокирует ответ клиенту. Если вы этого не хотите, вы можете запустить новый поток и запустить в нем команду. - person Rohan; 05.11.2013
comment
при его выполнении запрашивается имя схемы в терминале (введите схему БД ('?' для списка схем): xxxx), где xxx имя имени схемы???????????? Итак, как передать имя схемы, например интерактивный терминал, и как изменить код пользователя в соответствии с моим требованием. - person giveJob; 29.05.2018

Хотя вы можете использовать call_command для вызова команды управления, на самом деле это не идеально. Команды управления должны выполняться человеком в интерактивном режиме из оболочки, а не вызываться из представления.

Если вы хотите предложить и команду управления, и веб-операцию, переместите внутренности вашей команды управления в отдельную функцию (я рекомендую myapp/operations/foo). Затем реорганизуйте команду управления, чтобы использовать эту независимую функцию. Как только это сработает, реорганизуйте представление, чтобы оно вызывало ту же операцию (функцию), передавая те же аргументы.

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

person shacker    schedule 18.09.2018