目录
安装
*以下的修改需要配合uwsgi,nginx的重启一起。
1.改nginx.conf
uwsgi提供了一个端口,可以看做为Python工作区。而nginx.conf决定哪些可以进入(怎样进入)工作区。
将网址 /wss 的访问以 upgrade 的形式 扔到 uwsgi 端口。
而 “/” (全网站主要内容)则将以一般形式 扔到 uwsgi 端口。
两者都是用uwsgi_pass到 uwsgi身后的Python工作区的。
location /wss {
include uwsgi_params;
uwsgi_pass 127.0.0.1:3389; #与https的“/”保持一致
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
2.改 uwsgi.ini
当增加以下内容后,运行 uwsgi --ini 将会看到提示,其中以下三者都会出现在提示里面。
这是为uwsgi配置异步核心(此处30个cores)。
async = 30
ugreen = ''
http-timeout = 300
3.改Django
在settings.py加入以下声明。让uwsgi代理的wss指令能够被django解读。
WEBSOCKET_FACTORY_CLASS = 'dwebsocket.backends.uwsgi.factory.uWsgiWebSocketFactory'
4.安装dwebsocket
pip3 install dwebsocket
修改settings.py,在INSTALLED_APPS 里添加
'dwebsocket',
然后在py的空白区添加
WEBSOCKET_ACCEPT_ALL=True # 可以允许每一个单独的视图实用websockets
WSS规范
1.概览
#Python def部分
WSS的开发与普通https的Ajax.py一样,实际上WSS只是一个ajax def。
使用require,当用https访问时,会返回400错误。并无必要将wss方法用一般https访问,故用require阻止https访问即可。
from dwebsocket.decorators import require_websocket
@require_websocket
def wsstest(request):
request.websocket.send(''.encode('utf-8'))
聊天室群发的关键是保存客户端的ws对象 ,再用 for 循环逐个发送。
var citizens = {}
var citizenlist = {}
citizens[citizenid] = request.websocket
citizenlist.push(citizenid)
for citizenid in citizenlist:
citizens[citizenid].send()
send可以发送json ,在send函数里加入。
json.dumps({"msg":}).encode("'utf-8'")
#Vue js部分
在Vue代码里建立实例,其地址和https匹配 django 的 urls.py 的方法一致。 但是必须是在nginx里面设定过可upgrade的目录(例如/wss 目录)。
var ws = new WebSocket("wss://unitedfront.press/wss");
通常在open时发送自己的citizenid。
ws.onopen = function () {
ws.send("");
};
最重要的部分,接收wss-def发送的信息。与ajax类似。
ws.onmessage = function (res) {
var msg = res.data;
};
在退出浏览器或其它行为关闭WebSocket时,告知浏览器将自己的身份注销。
ws.onclose = function () {
ws.send("");
};