带 Django 身份验证的 Tornado

Tornado with Django authentication

这是我的想法:

我想在特定端口上使用 tornado 服务器,比方说 8666.

这是我目前所做的:

现在我希望客户端连接到端口 8666 (pure TCP) 并发送一些东西(也许是他的会话 cookie 或其他东西)这样我就可以在 tornado 网络服务器上看到客户端是否经过身份验证,并查看数据库以找出在 tornado 网络服务器上也连接了哪些其他伙伴,这样当这个客户端写入时一些东西,我可以将他的消息发送给所有其他 "concerned" 连接的客户端。

我没有找到任何相关文档。你知道如何处理吗?任何例子,或者如果我不在正确的轨道上,我应该怎么做?

如果您的 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',确保可以通过 sys.path) 然后按照 Django docs.

中的解释调用 setup()