在龙卷风应用程序中使用 Django - 无法访问龙卷风应用程序启动后创建的 MySQL 记录



我有一个tornado.websocket.WebocketHandler的子类。在这个类中,我有一种方法,它使用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()

运气不好。

基于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

实际上,在玩了一段时间后,只需要添加一行:

django.db.connection.close()

到WebSocketHandler的open方法。这迫使Django在第一次数据库调用时重新建立连接。。。

使用龙卷风处理程序中的django-orm可能很棘手;由于django的中间件没有运行,您需要一些钩子来启动和停止请求。这是我几年前写的一篇文章;我不知道它是否仍然有效:https://gist.github.com/bdarnell/654157.现在回过头来看,我不确定它对于异步请求是否正确;我想您应该在包含数据库调用的段前后执行prepare/finish中的要点。

相关内容

  • 没有找到相关文章

最新更新