ZBLOG

django3+channels3新建https wss服务,从建项目开始完整流程

好的,下面是新建Django3 + Channels3 HTTPS WSS服务的完整流程:

  1. 安装Django3和Channels3

在开始之前,请确保已经安装了Python和pip。然后,使用以下命令安装Django和Channels:

pip install Django==3.2.5 channels==3.0.4
  1. 新建Django项目

使用以下命令创建一个新的Django项目:

django-admin startproject mysite
cd mysite

其中,”mysite”是您的项目名称。

  1. 配置HTTPS证书

在这里我们使用Let’s Encrypt提供免费HTTPS证书来保护网站。首先安装certbot:

sudo apt-get update
sudo apt-get install certbot python-certbot-nginx -y

然后执行下面的命令为您的域名获取证书:

sudo certbot --nginx -d example.com -d www.example.com

注意将 example.com 替换成您自己的域名。

如果一切正常,certbot会自动配置Nginx服务器以使用SSL并更新您的Nginx配置文件。现在可以测试一下是否能够通过https访问您的网站。

  1. 配置ASGI服务器

接下来,我们需要为ASGI应用程序(即Channels)配置服务器。本例中我们将使用Daphne作为ASGI服务器。

首先,在项目根目录中创建一个新文件asgi.py,并添加以下内容:

import os

from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from django.urls import path
from channels.auth import AuthMiddlewareStack

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AuthMiddlewareStack(
        URLRouter(
            # your websocket URL routing here
        )
    ),
})

在上面的代码中,我们导入了Django的ASGI应用程序,并创建了一个ProtocolTypeRouter对象,将HTTP和WebSocket流量分别路由到不同的处理方式。当收到WebSocket请求时,我们使用Channels进行处理。

  1. 配置Channels路由器

接下来,我们需要为Channels配置路由器。在项目根目录中创建一个新文件routing.py,并添加以下内容:

from django.urls import re_path

from .consumers import MyConsumer

websocket_urlpatterns = [
    re_path(r'ws/myendpoint/$', MyConsumer.as_asgi()),
]

这里定义了一个WebSocket端点URL /ws/myendpoint/ 并将它与名为 MyConsumer 的 Consumer 类关联起来。

  1. 创建Consumer类

接下来,在项目根目录中创建一个新文件consumers.py,并添加以下内容:

import json

from channels.generic.websocket import AsyncWebsocketConsumer


class MyConsumer(AsyncWebsocketConsumer):
    
    async def connect(self):
        await self.accept()
        
    async def disconnect(self, close_code):
        pass
    
    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']
        
        await self.send(text_data=json.dumps({
            'message': message
        }))

在上面的代码中,我们定义了一个名为 MyConsumer 的WebSocket Consumer类。该类处理来自客户端的连接请求,并接收和发送消息。

  1. 配置Nginx

最后,我们需要配置Nginx以通过HTTPS和WSS代理传输流量。

在这里,我们可以使用之前安装certbot时生成的SSL证书文件。在/etc/nginx/sites-available/目录下创建新文件mysite.conf,并添加以下内容:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /path/to/mysite/;
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;

        proxy_pass http://127.0.0.1:8000;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
         # WebSocket support
        proxy_redirect off;
        proxy_buffering off;

        proxy_cache off;

        tcp_nodelay on;

        # WebSocket support
        keepalive_timeout 3600s;
        
    	# WSS Support
    	proxy_pass http://localhost:8000/;
    	proxy_http_version 1.1;
    	proxy_set_header Upgrade $http_upgrade;
    	proxy_set_header Connection "upgrade";
    }
}

在上面的代码中,我们定义了两个Nginx虚拟主机。一个是HTTP,用于将所有流量重定向到HTTPS。另一个是HTTPS,它代理所有流量到Django应用程序,并启用WebSocket和WSS支持。

注意将 example.com 替换成您自己的域名。

  1. 运行ASGI服务器

最后,通过以下命令启动Daphne ASGI服务器:

daphne mysite.asgi:application --port 8000 --bind localhost

这会在本地主机的8000端口上绑定Daphne服务器,并运行我们之前编写的ASGI应用程序。

现在您就可以使用浏览器访问https://example.com/ws/myendpoint/来测试WebSocket连接是否正常工作了。如果一切顺利,则可以开始构建更复杂的应用程序!

希望这些步骤对您有所帮助!

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=3155

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?