发布于 2026-01-06 0 阅读
0

Django Channels 入门指南 - 一个简单的聊天应用(第一部分)

Django Channels 入门指南 - 一个简单的聊天应用(第一部分)

在上一篇文章中,我讨论了 WebSocket 以及如何从客户端/JavaScript 建立 WebSocket 连接。今天,我们将开始编写一个简单的聊天应用程序,这将有助于演示 WebSocket 的工作原理以及如何构建实时 Django 应用程序。


我们已经知道,在典型的 Django 项目中,客户端发出 HTTP 请求,Django 调用负责管理此请求的视图,并将响应返回给客户端。

这种通信方式相当标准。但自从 Django 引入 ASGI 并开始原生支持它之后,我们除了可以编写同步代码之外,还可以编写包含异步代码的 Django 应用程序。允许我们使用 WebSocket 的Django Channels也是基于 ASGI 构建的。


在深入探讨之前,我们先来谈谈 ASGI 及其前身 WSGI。

WSGI ——WSGI是Web服务器网关接口的缩写。它是一种规范,描述了Web服务器如何与Web应用程序通信,以及如何将多个Web应用程序链接在一起以处理同一个请求。它就像一个中介,用于在Web服务器和Python应用程序之间进行交互。

ASGI - ASGI(异步服务器网关接口)是 WSGI 的精神继承者,旨在为支持异步的 Python Web 服务器、框架和应用程序提供标准接口。

因此,区别在于 WSGI 为运行同步应用程序提供了一个标准,而 ASGI 允许我们运行异步应用程序,从而使我们能够使用更高级的协议,例如 Web 套接字,它可以通过单个连接发送和接收多个数据。

如果我们的应用启用了 ASGI,Django 将允许我们编写异步视图并管理异步请求。但是,要编写与 WebSocket 配合使用的异步应用,我们需要使用 Django Channels。

如果你还没看过,请在继续阅读之前先看看我上一篇关于WebSocket 的文章。


Django频道

Django channels 不仅限于 HTTP,还支持其他协议,例如 Web 套接字,并且基于 ASGI 构建。

我们将在通道中看到的底层实现与我们通常使用的常规 HTTP 视图非常相似。为了处理 WebSocket 连接,通道使用了routing.pyconsumers.py 文件

  • routing.py与urls.py类似。
  • consumers.py类似于views.py

当收到请求或新的套接字连接时,通道会遵循其路由表,找到与该传入连接匹配的消费者,并启动该连接的副本。稍后会详细介绍。


设置和安装

1)搭建虚拟环境
2)安装 Django 然后创建一个项目

pip install django
django-admin startproject config .
Enter fullscreen mode Exit fullscreen mode

3)安装频道

pip install channels
Enter fullscreen mode Exit fullscreen mode

4)在设置中将频道添加到已安装的应用列表中。

settings.py

INSTALLED_APPS = [
    # ...
    'channels',
]
Enter fullscreen mode Exit fullscreen mode

5) 打开项目中的asgi.py文件,并按如下方式进行调整,以封装 Django ASGI 应用程序:

asgi.py

import os

import django
from channels.http import AsgiHandler
from channels.routing import ProtocolTypeRouter

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
django.setup()

application = ProtocolTypeRouter({
  "http": AsgiHandler(),
  # We will add WebSocket protocol later, but for now it's just HTTP.
})
Enter fullscreen mode Exit fullscreen mode

6)最后,将 ASGI_APPLICATION 设置指向该路由对象作为根应用程序:

settings.py

ASGI_APPLICATION = "config.asgi.application"
Enter fullscreen mode Exit fullscreen mode

完美!现在 Channels 已经接管了 runserver 命令,从现在开始将运行一个 ASGI/Channels 开发服务器。

运行开发服务器进行验证python manage.py runserver,您将看到以下内容:

开发服务器


入门

使用 Channels 和 ASGI 的最佳入门方式是创建一个简单的聊天应用。因此,完成基本设置和安装后,就可以开始创建 Django 应用了。

python manage.py startapp chat
Enter fullscreen mode Exit fullscreen mode

将其添加到设置中的已安装应用列表中。

settings.py

INSTALLED_APPS = [
    # ...
    'chat',
]
Enter fullscreen mode Exit fullscreen mode

好的,对于这个简单的聊天应用程序,我们将有 2 个视图。

  • 我们要创建的第一个视图是索引视图。用户可以通过这个视图输入他们想要加入的聊天室名称。
  • 第二个视图是房间视图,允许同一连接中的用户查看在该聊天室中发布的消息。

在本教程中,我们将创建第一个视图,即索引视图。

话虽如此,我们还是打开聊天应用,创建一个模板目录。在模板目录下,创建一个名为chat 的目录,然后在 chat 目录下创建一个名为index.html的文件。

将以下代码放入index.html文件中。

index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Chat Room</title>
</head>
<body>
    What chat room would you like to enter?<br>
    <input id="room-name-input" type="text" size="100"><br>
    <input id="room-name-submit" type="button" value="Enter">

    <script>
        document.querySelector('#room-name-input').focus();
        document.querySelector('#room-name-input').onkeyup = function(e) {
            if (e.keyCode === 13) {  // enter, return
                document.querySelector('#room-name-submit').click();
            }
        };

        document.querySelector('#room-name-submit').onclick = function(e) {
            var roomName = document.querySelector('#room-name-input').value;
            window.location.pathname = '/chat/' + roomName + '/';
        };
    </script>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode
  • 上述 html 文件中的脚本非常简单明了。它将监听事件,例如,当用户在聊天室中输入内容后按下回车键或提交按钮时,他/她将被重定向到房间视图http://127.0.0.1:8000/chat/roomName/

现在,让我们创建与上述模板关联的视图。

views.py

from django.shortcuts import render

def index(request):
    return render(request, 'chat/index.html')
Enter fullscreen mode Exit fullscreen mode

现在,在聊天应用程序中创建urls.pyindex模块,并将视图映射到 url 模式。

chat/urls.py

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
Enter fullscreen mode Exit fullscreen mode
  • 打开项目的urls.py文件,并添加聊天应用程序的网址。

config/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('chat/', include('chat.urls')),
]
Enter fullscreen mode Exit fullscreen mode

是时候检查它是否正常工作了。

python manage.py runserver
Enter fullscreen mode Exit fullscreen mode

在浏览器中访问http://127.0.0.1:8000/chat/,即可看到首页。输入聊天室名称,您将被重定向到房间视图,但由于我们尚未创建该房间,因此会显示“页面未找到”错误页面。

做得好!

参考资料 - https://channels.readthedocs.io/en/stable/

今天就到这里。在接下来的教程中,我们将创建房间视图并开始编写消费者。

文章来源:https://dev.to/earthcomfy/getting-started-with-django-channels-a-simple-chat-app-2a7m