我有一个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
中的要点。