Javascript 正在django socketio中获取用户

Javascript 正在django socketio中获取用户,javascript,python,django,socket.io,Javascript,Python,Django,Socket.io,一旦使用django socketio通过Socket.IO连接将消息从客户端(JS)发送到服务器(django/python),是否可以确定在呈现页面时验证了哪个用户 在这种情况下,视图由django提供,它需要身份验证——通常在服务器上,我可以执行user=request.user,但在events.py文件中,request.user只返回一个AnonymousUser对象。这是有意义的,因为websocket服务器与django web服务器是一个完全独立的进程,因此用户没有在该套接字连

一旦使用django socketio通过Socket.IO连接将消息从客户端(JS)发送到服务器(django/python),是否可以确定在呈现页面时验证了哪个用户

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

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


有人想出了解决这个问题的聪明办法吗?

找到了我自己解决这个问题的办法。诀窍是在将django
request
对象中的
session\u键添加到django socketio消息中,然后再将其发送到服务器;然后回到服务器端,您可以将
session\u键
解析回用户对象。代码如下:

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


利润

为了避免skandocious在答案中额外的数据库命中,可以使用Django's。这涉及到设置
memcached
并修改
SESSION\u引擎
设置以使用您选择的缓存后端。

虽然我没有任何代码可供您重用,但这似乎是socket.io的一个已知限制-它会影响数据库的每一条on\u消息。这真的有必要吗?fixedI假设我可以将用户对象添加到套接字上下文中,并在访问数据库之前进行检查。很好的一点——谢谢。只是看了你建议的代码,不幸的是,我认为它完全没有理解这里的意思。在任何情况下,用户都可以不向套接字服务器证明其身份(即不发送会话密钥)。但是,也许可以在套接字上下文中缓存用户信息,这样就不必在每条消息上都命中数据库。如果可能的话,我会在以后研究并编辑我的代码。昨天我睡觉的时候,我又看了一遍,得出了相同的结论,但是像socketio这样的系统的要点是不要太重,而且访问数据库是很关键的。可能将会话用于缓存或redis之类的东西,并且仅验证会话密钥是否有效,并且仅在会话密钥更改时偶尔获取用户(缓存)。
<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>
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)