好的,下面是新建Django3 + Channels3 HTTPS WSS服务的完整流程:
- 安装Django3和Channels3
在开始之前,请确保已经安装了Python和pip。然后,使用以下命令安装Django和Channels:
pip install Django==3.2.5 channels==3.0.4
- 新建Django项目
使用以下命令创建一个新的Django项目:
django-admin startproject mysite
cd mysite
其中,”mysite”是您的项目名称。
- 配置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访问您的网站。
- 配置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进行处理。
- 配置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 类关联起来。
- 创建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类。该类处理来自客户端的连接请求,并接收和发送消息。
- 配置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
替换成您自己的域名。
- 运行ASGI服务器
最后,通过以下命令启动Daphne ASGI服务器:
daphne mysite.asgi:application --port 8000 --bind localhost
这会在本地主机的8000端口上绑定Daphne服务器,并运行我们之前编写的ASGI应用程序。
现在您就可以使用浏览器访问https://example.com/ws/myendpoint/来测试WebSocket连接是否正常工作了。如果一切顺利,则可以开始构建更复杂的应用程序!
希望这些步骤对您有所帮助!