使用django-socketio通过从客户端(JS)到服务器(django / python)的Socket.IO连接发送消息后,是否可以确定在呈现页面时哪个用户已经过身份验证?
在这种情况下,视图由django提供,它需要身份验证 - 通常在服务器上我可以user = request.user
,但在events.py
文件中{{1}只返回一个request.user
对象。这是有道理的,因为websocket服务器是一个完全独立的进程,而不是django Web服务器,因此用户没有在该套接字连接上进行身份验证。
我想我必须想出一些聪明的代码来将用户ID嵌入到发送到服务器的消息中,在这种情况下我需要添加一些握手以确保结束用户无法欺骗它。
有没有人想出一个解决这个问题的聪明方法?
答案 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
设置以使用您选择的缓存后端。