Django中使用websocket
pip install dwebsocket
settings.py中的配置
INSTALLED_APPS = [
.....
.....
'dwebsocket',
]
MIDDLEWARE_CLASSES = [
......
......
'dwebsocket.middleware.WebSocketMiddleware' # 为所有的URL提供websocket,如果只是单独的视图需要可以不选
]
WEBSOCKET_ACCEPT_ALL=True # 可以允许每一个单独的视图实用websockets
views.py中使用
...
from dwebsocket.decorators import accept_websocket
# @login_required
@accept_websocket
def dashboard(request):
return DashboardHandler(request).response()
class DashboardHandler(BaseHandler):
def __init__(self, request):
super(DashboardHandler, self).__init__(request)
def page(self, x):
try:
if self.request.is_websocket():
# start do check clients
count = 0
while True:
count += 10
time.sleep(2)
self.request.websocket.send(('%s%%' % count).encode('utf-8'))
if count == 100:
break
else:
return render(self.request, 'engine/admin/main.html')
except Exception as err:
logger.exception(err)
在index.html中的显示
<!DOCTYPE html>
<html>
<head>
<title>django-websocket</title>
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<script type="text/javascript">//<![CDATA[
$(function () {
$('#send_message').click(function () {
var socket = new WebSocket("ws://" + window.location.host + "/echo_once/");
socket.onopen = function () {
console.log('WebSocket open');//成功连接上Websocket
socket.send($('#message').val());//发送数据到服务端
};
socket.onmessage = function (e) {
console.log('message: ' + e.data);//打印服务端返回的数据
$('#messagecontainer').prepend('<p>' + e.data + '</p>');
};
});
});
//]]></script>
</head>
<body>
<br>
<input type="text" id="message" value="Hello, World!"/>
<button type="button" id="send_message">发送 message</button>
<h1>Received Messages</h1>
<div id="messagecontainer">
</div>
</body>
</html>
wss: Error during WebSocket handshake: Unexpected response code: 200报错
修改nginx的配置文件即可
对我来说,解决方法是设置以下响应标头:“主机”,“连接”和“升级”。对于nginx情况(socket.io服务器在代理后面):
location /foo/ {
proxy_pass http://foobar:3005/;
proxy_http_version 1.1; # 新增
proxy_set_header Upgrade $http_upgrade; # 新增
proxy_set_header Connection "upgrade"; # 新增
proxy_set_header Host $host; # 新增
}