Как запустить скрипт до и после выполнения выражения Python в оболочке Django? - PullRequest
0 голосов
/ 24 сентября 2018

Я хочу заставить команду управления Django shell запустить скрипт до и после , выполняется каждое выражение Python.Например:

(Подумайте, я использую команду python3 manage.py shell --ipython для входа в оболочку.)

In [1]: from api.models import Student
In [2]: new_student = Student.objects.create(name="John Doe", number=123)
In [3]: new_student.number
Out[3]: 123
In [4]: new_student.name
Out[4]: "John Doe"

Я хочу отправить выражения и их результаты на Slack channel . Для этого мне нужно запустить скрипт Python до и после каждого выражения , которое принимает выражения или выходные данные для входа в мой канал Slack.

Для приведенного выше примераскрипт будет записывать выражения, например "new_student.number", и их выходные данные - если, конечно, существуют - например, "123", на канал Slack .

.попытался использовать модуль django-extensions , использовал команду shell_plus с пре и пост-сигналами .Но это был только вызов сигналов до и после запуска plus_shell .Поэтому я хотел запустить обработчики сигналов до и после каждой команды / выражения .

Есть ли способ добиться этого с помощью конфигурации, модуля или даже написания пользовательскогокоманда управления?

1 Ответ

0 голосов
/ 24 сентября 2018

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

def wrap_fun(expr):
    val=exec(expr)
    ## run/call your script with argument expr and val
    print(val)

, а затем вызывая все ваши функции как

In [1]: wrap_fun('from api.models import Student')
In [2]: wrap_fun('new_student = Student.objects.create(name="John Doe", number=123)')
In [3]: wrap_fun('new_student.number')
Out[3]: 123
In [4]: wrap_fun('new_student.name')
Out[4]: "John Doe"

. Вы можете использовать модуль subprocess для загрузки скрипта Python (который отправляет слабые сообщения) и вызова его.В качестве альтернативы, вы можете добавить эту функцию и слабый скрипт в ваш проект Django в модуле, управлять поведением отправки через локальную настройку, такую ​​как DEBUG=true, а затем вызывать ее прямо из оболочки.

...