Django中使用websocket


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;             # 新增
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM