【问题标题】:Is it possible to start Daphne in a python script without using an OS call是否可以在不使用操作系统调用的情况下在 python 脚本中启动 Daphne
【发布时间】:2017-02-22 00:43:24
【问题描述】:

是否可以从 python 脚本运行 daphne 进程甚至只是 Django 通道?

推荐的方法是运行

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

我想知道我是否可以将它绑定到一个变量并以 Tornado 的方式运行它

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

【问题讨论】:

    标签: python django django-channels daphne


    【解决方案1】:

    我对 Django Channels 不熟悉,但您是否尝试过直接使用 inmemory 或 redis Channels?你也许可以完全避免达芙妮。据我了解,daphne 似乎是协议翻译层,因此外部客户端可以通过 daphne 与 Django 通信(Django 使用 wsgi 而不是 asgi,因此 Django 无法单独处理某些协议,例如 websocket 通信)。 Tornado 不依赖 wsgi。

    达芙妮测试中有一些例子: https://github.com/django/daphne/blob/master/daphne/tests/test_http.py

    inmemory ChannelLayer 不是跨进程的。我不确定这在您的用例中是否重要。如果有,可以查看其他后端(如redis通道)https://channels.readthedocs.io/en/stable/backends.html

    这可能是您正在寻找的更直接的内容: https://github.com/django/asgi_redis

    【讨论】:

    • 我昨晚刚开始读到这个。事实上,这看起来像是我必须自定义以使用我的 Daphne 运行其他 python 代码的对象。仍在调查,但希望如此
    【解决方案2】:

    这是一种解决方法,但您可以像这样使用subprocess 模块:

    subprocess.run(["daphne", "-b 0.0.0.0 -p 8001 django_project.asgi:channel_layer"])

    查看此线程 Calling an external command in Python 以获取有关子进程模块使用的更多信息。

    【讨论】:

    • 是的,我知道我可以将其称为子进程,但除非我编写一堆 IPC 代码,否则这是行不通的
    • 您是否考虑过创建一个调用 daphne 的 .sh bash 脚本,就像您通常从命令行执行的操作并从子进程调用该脚本一样?
    • 这是当前的工作方式。理想情况下,我会将它作为 python 对象使用
    • 在子流程文档中,声明它返回一个 CompletedProcess 实例,所以它是一个对象...
    【解决方案3】:

    【讨论】:

    • 嗯,这有什么帮助?另外我没有使用 Tornado,我使用的是 Django Channels
    猜你喜欢
    • 2017-04-17
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    相关资源
    最近更新 更多