带 Django 身份验证的 Tornado
Tornado with Django authentication
这是我的想法:
- 有一个接收/发送 JSON 信息的 Django 网站,这样我就可以为网络浏览器或 Unity/UE 客户端
创建一个 JavaScript 客户端
- 我想要一个仅适用于 Unity/UE 客户端的新功能:实时聊天。
我想在特定端口上使用 tornado 服务器,比方说 8666
.
这是我目前所做的:
- 在 Django 网站上进行身份验证
- 使 Django 网站上的一切正常
现在我希望客户端连接到端口 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()
这是我的想法:
- 有一个接收/发送 JSON 信息的 Django 网站,这样我就可以为网络浏览器或 Unity/UE 客户端 创建一个 JavaScript 客户端
- 我想要一个仅适用于 Unity/UE 客户端的新功能:实时聊天。
我想在特定端口上使用 tornado 服务器,比方说 8666
.
这是我目前所做的:
- 在 Django 网站上进行身份验证
- 使 Django 网站上的一切正常
现在我希望客户端连接到端口 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()