在 Tornado 应用程序中使用 Django - 无法访问 Tornado 应用程序启动后创建的 MySQL 记录
Posted
技术标签:
【中文标题】在 Tornado 应用程序中使用 Django - 无法访问 Tornado 应用程序启动后创建的 MySQL 记录【英文标题】:Using Django inside Tornado App - Can't Access MySQL Records Created After The Tornado App Starts 【发布时间】:2014-06-06 18:55:28 【问题描述】:我有一个 tornado.websocket.WebSocketHandler 的子类。在该类中,我有一个方法使用 Django ORM 从子类的模型中获取用户:django.contrib.auth.models.AbstractUser。抓取用户的代码如下:
user_model = get_user_model()
try:
user = user_model.objects.get(pk=user_id)
return user
except user_model.DoesNotExist:
return None
注意:如果对应于 user_id 的用户在 Tornado 脚本启动之前就在数据库中,这绝对可以正常工作。
但是,如果我在脚本启动后创建一个新用户,上面的代码总是返回 None。就好像脚本在脚本启动时只能访问数据库的快照。我什至尝试过运行原始 sql 查询,结果完全相同:
cursor = connection.cursor()
cursor.execute("SELECT * FROM custom_user_table WHERE id = %s", [node_id])
row = cursor.fetchone()
运气不好。
【问题讨论】:
【参考方案1】:根据 Ben Darnell 的代码,只需要以下内容:
from django.db import connection
if user_id is None:
return None
try:
connection.queries = []
user = user_model.objects.get(pk=user_id)
connection.close()
return user
except user_model.DoesNotExist:
return None
【讨论】:
其实,经过一番大惊小怪,只需要添加:【参考方案2】:其实玩了一会之后,只需要添加一行:
django.db.connection.close()
到 WebSocketHandler 的 open 方法。这会强制 Django 在第一次 db 调用时重新建立连接...
【讨论】:
【参考方案3】:在 tornado 处理程序中使用 django orm 可能会很棘手;由于 django 的中间件没有运行,您需要一些钩子来启动和停止请求。这是我几年前为此写的;我不知道它是否仍然有效:https://gist.github.com/bdarnell/654157。现在回想起来,我不确定它对于异步请求是否正确;我认为您希望在包含数据库调用的段之前和之后执行此要点中 prepare/finish
中的内容。
【讨论】:
以上是关于在 Tornado 应用程序中使用 Django - 无法访问 Tornado 应用程序启动后创建的 MySQL 记录的主要内容,如果未能解决你的问题,请参考以下文章
Django、websockets、Tornado,如何让它们通信?
如何将 Django 与 Tornado 网络服务器一起使用?