2014-06-06 37 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重新建立第一個數據庫調用的連接...

相關問題