2012-09-06 4 views
2

전역 변수를 사용하는 장고 앱을 만들었습니다. 사실 내 view.py의 모든 함수에서 사용할 수있는 일종의 저장소 개체입니다.Django보기에서 전역 변수를 없애고 있습니까?

코드에서 볼 수 있듯이 각보기 기능은 rp 전역 변수를 수정합니다.

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)) 

view.py는 약간의 검색 후, 나는이 그들이 글로벌 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 장고보기에서 전역 변수에 관한 질문이 있습니다. 의견을 제시해 주실 수 있습니까? http://stackoverflow.com/questions/39490843/django-app-level-variables –

관련 문제