2014-06-06 39 views
0

我有一个tornado.websocket.WebSocketHandler的子类。在那个类中,我有一个方法使用Django ORM从一个模型中获取用户,该模型的子类为:django.contrib.auth.models.AbstractUser。 ,抓住用户的代码如下:在Tornado应用程序中使用Django - 无法访问Tornado应用程序启动后创建的MySQL记录

user_model = get_user_model() 

try: 
    user = user_model.objects.get(pk=user_id) 
    return user 
except user_model.DoesNotExist: 
    return None 

注:这工作绝对没问题,如果对应USER_ID用户在数据库中的龙卷风脚本开始之前。

但是,如果在脚本启​​动后创建新用户,上面的代码始终返回None。就好像该脚本只能在脚本启动时访问数据库的快照。我甚至尝试运行一个原始的SQL查询与完全相同的结果:

cursor = connection.cursor() 
cursor.execute("SELECT * FROM custom_user_table WHERE id = %s", [node_id]) 
row = cursor.fetchone() 

没有运气。

回答

0

从龙卷风处理程序中使用django orm可能会很棘手;由于django的中间件没有运行,你需要一些钩子来启动和停止请求。这是我多年前写的这样做的东西;我不知道它是否仍然有效:https://gist.github.com/bdarnell/654157。现在回顾一下,我不确定异步请求是否正确;我想你会想要在包含数据库调用的段之前和之后执行prepare/finish中的内容。

0

根据本达内尔的代码时采取了以下内容:

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 
+0

其实,经过一番琐事之后,所需要的只是添加: – Corky

0

其实,张望了一下,所有需要打后添加一行:

django.db.connection.close() 

到WebSocketHandler的开放方法。这迫使Django重新建立第一个数据库调用的连接...

相关问题