在 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,如何让它们通信?

在 Heroku 上部署 Django\Tornado

tornado 模板引擎

如何将 Django 与 Tornado 网络服务器一起使用?

tornado和django的结合使用 tornado Server for django WSGI APP

在 gunicorn 和 Tornado 上使用 Django 项目