【问题标题】:Tornado with Django authentication带有 Django 身份验证的龙卷风
【发布时间】:2018-01-25 11:22:25
【问题描述】:

这是我的想法:

  • 拥有一个接收/发送 JSON 信息的 Django 网站,以便我可以为 Web 浏览器或 Unity / UE 客户端创建 JavaScript 客户端
  • 我想要一个仅适用于 Unity / UE 客户端的新功能:实时聊天。

我想在特定端口上使用 Tornado 服务器,比如说 8666

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

  • 在 Django 网站上进行身份验证
  • 让一切都在 Django 网站上运行

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

我没有找到任何关于此的文档。你知道如何处理这个吗?举个例子,或者如果我没有走上正轨,那我该怎么办?

【问题讨论】:

标签: django tornado


【解决方案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',确保可以通过sys.path 找到它)然后调用@ 987654328@ 如 Django docs 中所述。

【讨论】:

  • 谢谢,这正是我想要的。很有用
猜你喜欢
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
相关资源
最近更新 更多