使用Django身份验证的龙卷风

时间:2018-01-25 11:22:26

标签: django tornado

这是我的想法:

  • 有一个Django网站,可以接收/发送JSON信息,这样我就可以为Web浏览器或Unity / UE客户端创建一个JavaScript客户端
  • 我只想为Unity / UE客户端提供新功能:实时聊天。

我想在特定端口上使用龙卷风服务器,假设 8666

这是我到目前为止所做的:

  • 在Django网站上进行身份验证
  • 让所有内容都在Django网站上运行

现在,我希望客户端连接到端口 8666 TCP)并发送一些内容(可能是他的会话cookie或其他内容) )这样我就可以在龙卷风网络服务器上看到客户端是否经过身份验证,并查看数据库以找出龙卷风网络服务器上还连接了哪些其他配偶,以便当此客户端写入内容时,我可以将其消息发送给所有其他“关注”的关联客户。

我没有找到任何关于此的文档。你知道怎么办吗?任何一个例子,或者如果我不在正确的轨道上我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

如果您的Tornado进程在与Django应用程序相同的域上运行,则会话cookie将由浏览器在websocket握手时发送,并可通过WebSocketHandler.get_cookie()方法访问。

以下是一个示例,假设全局变量CLIENTS跟踪已连接的身份验证客户端:

def open(self):
    """Authenticate client based on session cookie, add broadcast notification"""
    session_id = self.get_cookie('sessionid')
    if not session_id:
        self.close()
    self.authenticate_user(session_id)
    if self.user is None:
        self.close()
    self.CLIENTS.append(self)
    self.notify_all_clients()

def authenticate_user(self, session_id):
    """Retrieve User instance associated to the session key."""
    session = SessionStore(session_key=session_id)
    user_id = session.get('_auth_user_id')
    if user_id is None:
        return
    try:
        user = User.objects.get(pk=user_id)
    except User.DoesNotExist:
        self.close()
    else:
        self.user = user

希望这有帮助!

编辑:

请注意,为了能够使用Django ORM,您必须将DJANGO_SETTINGS_MODULE环境变量设置为应用的设置模块路径(例如'myapp.settings',确保可以通过{{1}找到它然后按照Django docs中的说明调用sys.path