Можно ли запустить Дафну в сценарии Python без вызова ОС
Возможно ли запустить процесс daphne или даже просто каналы Django из скрипта python?
Рекомендуемый способ сделать это - запустить
daphne -b 0.0.0.0 -p 8001 django_project.asgi:channel_layer
Мне было интересно, смогу ли я связать это с переменной и запустить так, как мог бы Торнадо
from tornado.web import Application
application = Application([(r"/", RosbridgeWebSocket), (r"", RosbridgeWebSocket)])
4 ответа
Это своего рода обходной путь, но вы можете использовать модуль подпроцесса следующим образом:
subprocess.run(["daphne", "-b 0.0.0.0 -p 8001 django_project.asgi:channel_layer"])
Проверьте этот поток Вызов внешней команды в Python для получения дополнительной информации об использовании модуля подпроцесса.
Я не знаком с Django Channels, но вы пытались использовать каналы памяти inmemory или redis напрямую? Вы могли бы вообще избежать Дафны. Из того, что я понимаю, daphne кажется уровнем трансляции протоколов, поэтому внешние клиенты могут общаться с Django через daphne (Django использует wsgi, а не asgi, поэтому один Django не может обрабатывать определенные протоколы, такие как связь через веб-сокет). Торнадо не полагается на WSGI.
Примеры тестов Дафни: https://github.com/django/daphne/blob/master/daphne/tests/test_http.py
Канал ChannelLayer не является кросс-процессным. Я не уверен, имеет ли это значение в вашем случае использования. Если это так, вы можете проверить другие бэкэнды (например, каналы Redis) https://channels.readthedocs.io/en/stable/backends.html
Это может быть более прямым, что вы ищете: https://github.com/django/asgi_redis
Вы пробовали обменять торнадо на NGINX?
http://masnun.rocks/2016/11/02/deploying-django-channels-using-daphne/
Я столкнулся с этой же проблемой...
from daphne.cli import CommandLineInterface
CommandLineInterface().run(('my.asgi', '--bind', ip_address, '--port', '8000'))
Должен сделать трюк. Проблема в том, что я нигде не вижу этого задокументированного, поэтому API может быть не очень стабильным.
Это тот же маршрут кода, что и вызов Дафны через подпроцесс:https://github.com/django/daphne/blob/main/daphne/cli.py#L167https://github.com/django/daphne/blob/main . /дафна/cli.py#L204