Django AngularJS Tornado Websocket - 用户会话超时示例

时间:2014-12-17 10:02:47

标签: django angularjs session tornado

如何使用Django AngularJS Websocket设置用户会话到期

1 个答案:

答案 0 :(得分:2)

Django AngularJS龙卷风 - 如何用户会话超时示例

我使用Django 1.7b,DRF和AngularJS创建了一个Web应用程序。为了处理会话超时,如果会话在Django端使用服务器端推送事件(tornado)过期,我想从角度会话中自动注销用户。

我尝试使用文档,但没有为此提供良好的自我解释示例。经过两天的头脑风暴,我成功地实现了它。只为其他人分享这个简单的例子。

此示例为多个客户端提供服务。从浏览器传递令牌以打开连接。此令牌传递给websocket.py模块,在睡眠5秒后,在请求的客户端浏览器上广播相同的令牌。代码如下所示。

# -*- coding: utf-8 -*-

"""
Regular expression groups in URL pattern are passed as arguments to "open"
method of tornado.websocket.WebSocketHandler
"""

from tornado.web import Application
from tornado.websocket import WebSocketHandler
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
import time

class SampleWebSocket(WebSocketHandler):
    clients = []
    def check_origin(self, origin):
        return True

    def open(self, userid):
        self.clients.append(self)
        print ("connection_initiated")
        while True:
            time.sleep(5)
            self.write_message("%s" % userid)

    def on_close(self):
        self.clients.remove(self)
        self.write_message("connection_closed")

app = Application([
    (r'/user/([0-9]+)', SampleWebSocket),
    ],)

if __name__ == '__main__':
    http_server = HTTPServer(app)
    http_server.bind(8888)
    http_server.start(0)
    IOLoop.current().start()

使用以下命令执行此模块。

$: python3 websocket.py

使用以下代码创建两个HTML文件(index1.html和index2.html)并在浏览器中打开它。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
  <title>Tornado WebSocket Sample</title>
</head>
<body>
  <input type="text" id="token" value="76c7ea95f0e51fb9b047dfe7aab4ff3c099505e4" />
  <button id="connect">Connect</button>
  <div id="result"></div>
  <script>
  var $ = function (id) {
    return document.getElementById(id);
  };

  $('connect').addEventListener('click', function (evt) {
      evt.preventDefault();
    var token = $('token').value;

    var sock = new WebSocket('ws://localhost:8888/token/' + token);
    sock.onopen = function () {
      console.log('opened.');
    };
    sock.onclose = function () {
      console.log('closed.');
    };
    sock.onerror = function () {
      console.log('error.');
    };
    sock.onmessage = function (evt) {
      $('result').innerText = evt.data;
      alert(evt.data);
    };
  });
  </script>
</body>
</html>

点击连接值后,将打开双向连接,数据将从服务器推送到客户端。

要将它与您的Django代码集成,只需在python代码中添加django环境并开始使用模型。要设置Django的环境,请将以下代码添加到顶部的python websocket.py模块中。

import os
import sys

# Setup Django environment so that we can access Django models
sys.path.append(path to your project directory)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
django.setup()

完成此配置后,您将全部设置为在服务器和客户端之间设置websocket连接。希望这有助于某人。

龙卷风 - http://www.tornadoweb.org/en/stable/