使用没有视图的 Django 频道

Posted

技术标签:

【中文标题】使用没有视图的 Django 频道【英文标题】:Use Django Channels without views 【发布时间】:2020-11-12 21:20:38 【问题描述】:

我们想使用 Django Channels 来使用 Keras 和 Tensorflow 作为模型。我们已经尝试过 Flask,但它不能用于生产。然后我们尝试了Javas DeepLearning4J,但也遇到了很多问题。我们想用 Python 解决它。

问题是 Django 是全栈的,我们只需要使用 websockets 并执行我们的 python 代码并将结果发送回来。

Google 上没有关于如何做到这一点的示例。我们这样做是因为我们有一个 Angular 前端、Spring Boot 后端和另一个 Spring Boot 应用程序作为所有服务之间的连接器。我们不需要 Django 的大部分功能。

很难找出做什么。我认为没有@socket.route 或类似的东西。

Websocket using Django Channels这个问题可能有点帮助,但已经 3 岁了,可能已经过时了。实现我们需要的方法是什么?

【问题讨论】:

真的吗?!? channels documentation 中详细说明了如何使用 websockets。你到底错过了什么? 【参考方案1】:

如果我正确理解了您的问题,您想使用 Django Channels 而不在生产中使用任何 Django?

这不是问题,但您仍然必须在您的 virtualenv 中安装 Django。我假设,您知道如何配置应用程序的 Channels 部分,我将仅描述您如何使其工作。

    您仍然需要使用 django 启动项目:django-admin startproject 可以解决问题 现在您有一个工作的“核心”项目,您还需要设置您的频道routing。我在核心项目文件夹中使用了routing.py(在settings.py 旁边)。您还需要您的消费者,通常在同一位置的 consumers.py。 然后,您需要在settings.py 中设置您的频道部分。例如:
# Channels
ASGI_APPLICATION = 'myproject.routing.application'
CHANNEL_LAYERS = 
    'default': 
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': 
            "hosts": [('127.0.0.1', 6379)],
        ,
    ,

那么您需要编辑 INSTALLED APPS SECTION:

INSTALLED_APPS = [
    #if you dont want any of "standard" django just comment it out
    #'django.contrib.admin',
    #'django.contrib.auth',
    #'django.contrib.contenttypes',
    #'django.contrib.sessions',
    #'django.contrib.messages',
    #'django.contrib.staticfiles',
    'channels',   # <--- here you enable the channels part
]
    你准备好了!我不知道您使用的是什么 ASGI 服务器,但您将其指向您的 routing.py 文件中的应用程序对象。例如:
from channels.routing import ProtocolTypeRouter,URLRouter,ChannelNameRouter
from django.urls import path
from . import consumers # your actual consumers for the endpoint of routes

application = ProtocolTypeRouter(
    # Empty for now (http->django views is added by default)
    "websocket": URLRouter(
            [
                path('ws/route1/', consumers.ConsumerA),
                path('ws/route2/', consumers.ConsumerB),
                # and so on...
            ]
    ),
    "channel": ChannelNameRouter(
        "channel_name": consumers.ChannelConsumer,
        # and other channels you may have...
    )
)

基本上就是这样。所以一个 TLDR,你仍然需要运行 django,但是你可以在设置中去除除通道之外的所有内容......

【讨论】:

好吧,对不起,我对 Django 和 Python 完全陌生。我必须清除 urlpatterns = [] 现在我不知道如何在没有 urlPattern 的情况下连接到频道。使用 localhost:6379/ws/route1 ?或如何 @CptDayDreamer 你为什么不做我链接的教程。它具有所需的 javascript 部分,设置了在此答案中复制的所有这些配置,但随后以可用的方式并解释了沿途的内容,因此您实际上可以理解移动部分。是的,它将使用视图,但仅用于呈现为聊天室页面提供服务的 html @Melvyn 你不认为我已经这样做了吗?我做了,但我不明白,只是无法让它运行。否则我不会问 然后可能会询问有关该教程的具体问题。究竟是什么不起作用,因为它对我来说是完全透明的,并且在 5 分钟内启动并运行了房间。但是,如果您对 python 一无所知,那么您正在尝试跑步,然后才能走路并且应该采取a step back。 您好,很抱歉回复晚了,我又看了一遍您的问题,在我看来,您实际上不需要使用频道。通道扩展点是 (a) 使您能够在 django 中处理 websocket 和 (b) 启用 通道层 以便在所有连接的 websocket 客户端与服务器之间进行更轻松的通信。如果你不需要这个功能(这真的很好)并且只想运行一些你的python代码并返回它,你可以考虑使用Tornado server:tornadoweb.org/en/stable

以上是关于使用没有视图的 Django 频道的主要内容,如果未能解决你的问题,请参考以下文章

Django 频道:将表单数据传递给消费者

在 systemd 上使用 daphne 运行 django 频道

django 频道如何知道客户端已断开连接?

使用 django 频道时如何使用频道而不是组?

Django 消费者(Django 频道)中的表单数据验证(相当于 form.is_valid)

Django 现在在 Heroku 中使用 ASGI + WSGI 的频道