2012-09-06 32 views
2

我創建了一個依賴全局變量的Django應用程序。它實際上是一種存儲庫對象,它應該可用於我的view.py中的所有功能。如代碼中所見,每個視圖函數都會修改rp全局變量。在Django視圖中擺脫全局變量?

view.py

def index(request): 
    global rp 
    rp = repo.Repo() 
    ... 
    rp.function1() 
    rp.function2() 
    rp.attribute1 = value 

    return render_to_response('result_pick.html',{'result_list': rp.parsed_output_data, 'input_file_name': rp.input_file_name }, context_instance = RequestContext(request)) 

def result(request): 
    global rp 
    rp.function3() 
    local_atribute = rp.attribute1 
    .... 
    return render_to_response('result_show.html' ,{'rp':rp}, context_instance = RequestContext(request)) 

瀏覽了一下後,我得到的印象是,這將失敗的那一刻多個用戶將訪問該網頁,因爲他們將分享全球RP這將導致問題。

什麼是擺脫全局變量的首選解決方案,但仍然能夠在兩個函數中訪問rp?

+0

是的,從這樣的觀點函數中分配給全局是一個非常糟糕的主意。如果你打算擁有全局對象,它們需要是真正的全局對象,而不是綁定到任何特定的請求狀態。 –

回答

5

使用session框架;它在請求之間(並因此在你的視圖方法之間)持久化對象。

一旦你有它設置,它的那樣簡單:

def a_method(request): 
    shared_obj = request.session.get('myobj',{}) # set dict as default 
    shared_obj['key'] = 'val' 
    request.session['myobj'] = shared_obj 
    # your normal code 
    return render(request,'sometemplate.html') # no need to pass 'shared_obj' 

def b_method(request): 
    shared_obj = request.session.get('myobj',{}) 
    if not shared_obj: 
     # session was terminated, so initialize this object 
     shared_obj['key'] = 'value' 
    else: 
     the_value = shared_obj['key'] 
     # or, use the below to set a default value for 'key' if it doesn't exist 
     the_value = shared_obj.get('key','default') 
    # etc. 
+0

這很好。謝謝! – TheMeaningfulEngineer

+1

但會話只能保存可以序列化的對象。如果你想讓會話幫助你持有對套接字對象的引用,即使你使用本地內存後端緩存,它也會報告錯誤 – jean

+0

@BurhanKhalid我有一個關於Django視圖中全局變量的問題。可以請提供您的意見? http://stackoverflow.com/questions/39490843/django-app-level-variables –