让用户进入django-socketio

时间:2012-12-10 17:59:54

标签: javascript python django socket.io

使用django-socketio通过从客户端(JS)到服务器(django / python)的Socket.IO连接发送消息后,是否可以确定在呈现页面时哪个用户已经过身份验证?

在这种情况下,视图由django提供,它需要身份验证 - 通常在服务器上我可以user = request.user,但在events.py文件中{{1}只返回一个request.user对象。这是有道理的,因为websocket服务器是一个完全独立的进程,而不是django Web服务器,因此用户没有在该套接字连接上进行身份验证。

我想我必须想出一些聪明的代码来将用户ID嵌入到发送到服务器的消息中,在这种情况下我需要添加一些握手以确保结束用户无法欺骗它。

有没有人想出一个解决这个问题的聪明方法?

2 个答案:

答案 0 :(得分:4)

找到了我自己的解决方案。诀窍是将django session_key对象中的request添加到django-socketio消息中,然后再将其发送到服务器;然后回到服务器端,您可以将session_key解析回User对象。这是代码:

模板文件:(由django服务器提供)

<input type="hidden" id="session_key" value="{{ request.session.session_key }}">
...
<script type="text/javascript" charset="utf-8">
    function someHandler(action, post_id, some_val){
        var data = {
            'action': action,
            'post_id': post_id,
            'value': some_val,
            'session_key': $("#session_key").val()
        };
        socket.send(data);
    }
</script>

events.py:(由django-socketio服务器处理)

from django.contrib.sessions.models import Session
from django.contrib.auth.models import User

def message(request, socket, context, message):
    session = Session.objects.get(session_key=message['session_key'])
    uid = session.get_decoded().get('_auth_user_id')
    user = User.objects.get(pk=uid)

的利润!

答案 1 :(得分:0)

为了避免scandocious在答案中额外的数据库命中,可以使用Django的cached sessions。这涉及设置memcached并修改SESSION_ENGINE设置以使用您选择的缓存后端。