django 是否可以在python脚本中启动Daphne而不使用OS调用

zazmityj  于 2022-12-14  发布在  Go
关注(0)|答案(4)|浏览(280)

有没有可能从python脚本运行一个daphne进程或者仅仅是Django通道?
建议的方法是运行

daphne -b 0.0.0.0 -p 8001 django_project.asgi:channel_layer

我想知道我是否可以把它绑定到一个变量上,然后像龙卷风那样运行它

from tornado.web import Application
application = Application([(r"/", RosbridgeWebSocket), (r"", RosbridgeWebSocket)])
hlswsv35

hlswsv351#

这是一种变通方法,但您可以像这样使用子流程模块:
subprocess.run(["daphne", "-b 0.0.0.0 -p 8001 django_project.asgi:channel_layer"])
查看此线程在Python中调用外部命令以获取有关使用子进程模块的更多信息。

arknldoa

arknldoa2#

我对Django通道不太熟悉,但是你有没有尝试过直接使用inmemory或者redis通道?你也许可以完全避免使用daphne。据我所知,daphne似乎是协议转换层,因此外部客户端可以通过daphne与Django通信(Django使用wsgi而不是asgi,因此Django无法单独处理某些协议,例如WebSocket通信)。Tornado不依赖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

20jt8wwn

20jt8wwn4#

我遇到了同样的问题...

from daphne.cli import CommandLineInterface
CommandLineInterface().run(('my.asgi', '--bind', ip_address, '--port', '8000'))

应该可以了。问题是我在任何地方都没有看到这个文档,所以API可能不是很稳定。
这与通过子进程调用Daphne的代码路径相同:https://github.com/django/daphne/blob/main/daphne/cli.py#L167https://github.com/django/daphne/blob/main/daphne/cli.py#L204

相关问题