2016-08-23 11 views
-1

我正在Django寫一個小應用程序,我保持狀態保存在一些變量我聲明的方法在views.py。下面是該文件的重要組成部分:Django:「引用之前引用」,但只爲一些變量

from app.playerlist import fullList 
auc_unsold = fullList[:] 
auc_teams = [] 
auc_in_progress = [] 
auc_current_turn = -1 
print(auc_in_progress) 

def auc_action(request): 
    data = json.loads(request.GET["data"]) 

    # ... 

    elif data[0] == "start": 
     random.shuffle(auc_teams) 
     print(auc_unsold) 
     print(auc_in_progress) 
     auc_in_progress = [None, 0, None] 
     print(auc_in_progress) 

auc_unsoldauc_teams變量做工精細;雖然這個方法看不到auc_in_progress變量,但在標題中出現錯誤。如果我取出打印語句並讓該代碼爲其賦值,則只要我再次使用該變量,該異常就會在代碼中的其他位置拋出。

我試着做另一個變量,這個新的似乎也遭受了這個問題。

發生了什麼事?


編輯:我發現了一個解決辦法:如果我只是打印語句之前寫global auc_in_progress,然後一切工作正常。如果我嘗試着寫上面這個變量,那麼它不起作用,不過,出於某種原因。

我對此不滿意,因爲我不知道爲什麼會發生這種情況,並且因爲我不喜歡使用這樣的全局,但是呃。有人有解釋嗎?

回答

1

您絕對不應該這樣做,無論是您的原始代碼還是您提出的解決方案global

模塊級別的任何內容都將在請求之間共享,不僅針對當前用戶,而且針對該進程的所有用戶。所以每個人都會看到相同的拍賣等。

您錯誤的原因是因爲您在自己的功能中分配了該變量,這會自動使其成爲局部變量:有關更多詳細信息,請參閱this question。但在那裏推薦的解決方案與您的解決方法相同 - 即使用global - 在此處不適用;您應該將數據存儲在與用戶特別相關的某個地方,例如會話。

+0

嗯,但重點是讓更多的人蔘與同一個拍賣... 我同意它看起來很醜,我不知道「正確」的方式,它可能涉及數據庫和更結構化?但是,這僅僅是一個簡單的應用程序,我爲我和幾個朋友做的,對我來說是如此快速和骯髒的作品,特別是因爲我在最後期限。 – user1846231