2014-09-10 1 views
1

편집 : 게시물에서 "전역 변수"라고 말하면 mtcbody 스크립트를 참조하고 있습니다. 장고 코드는 전역 변수를 사용하지 않습니다.파이썬 스크립트가 로컬에서 실행 된 후 정리 Django에서

나는 다소 이상한 문제가 있습니다. XML 파일을 가져 와서 구문 분석하고 결과를 반환하는 python 스크립트가 있습니다. 이 스크립트에는 작업을 수행하는 데 사용하는 일부 전역 변수가 있습니다. 예를 들어 이클립스에서이 스크립트를 로컬로 실행하면이 전역 변수와 그 밖의 모든 변수가 결국 자동으로 삭제되고 새 실행은 새 리소스를 사용합니다 (예상대로).

그러나 장고보기에서이 스크립트를 실행하면 동일한 동작이 필요하지만 대신이 스크립트는 전역 변수를 유지하고 요청이있을 때마다이 스크립트를 추가합니다.

import mtcbody 

def doShit(): 
    context = {} 
    result = mtcbody.getData() 

    # the variable result['tvas_after'] is one of the global variables in the mtcbody script 
    print 'TVAs after: ' + str(result['tvas_after']) 

    return context 

if __name__ == '__main__': 
    doShit() 

그리고 처음 실행 한 후 결과 :

TVAs after: {'1': <mtcbody.TVA instance at 0x7f28011aac20>} 

초 실행 한 후 그 결과

TVAs after: {'1': <mtcbody.TVA instance at 0x7f94bbb96c20>} 

결과 다음

이클립스에서 로컬로 실행의 예 세 번째 실행 후 :

TVAs after: {'1': <mtcbody.TVA instance at 0x7f9509f49c20>} 

TVA 인스턴스를 보유하고있는 사전은 각 실행 중에 처음부터 다시 채워집니다. 지금 비교하는 장고보기에서 동일한 스크립트를 실행했을 때 얻는 행동 :

def index(request): 
    context = RequestContext(request) 
    result = mtcbody.getData() 

    print 'TVAs after: ' + str(result['tvas_after']) 

    return render(request, 'dashboardbase/table.html', context) 

결과 후 첫 새로 고침 (요청) 초 새로 고침 (요청시) 후

TVAs after: {'1': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff0850fb488>} 

결과

TVAs after: {'1': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff0850fb488>, '2': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff066e4afc8>} 

세 번째 새로 고침 후 결과 (요청)

TVAs after: {'1': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff0850fb488>, '3': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff0a1fa4ea8>, '2': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff066e4afc8>} 

본 그림에서 알 수 있듯이 스크립트의 변수는 장고보기 호출간에 유지됩니다. 누군가가이 동작을 설명하고 가능한 경우이를 피하고 어떻게 로컬에서 실행되는 것처럼 동작하게 할 수 있습니까?

고맙습니다.

+0

'mtcbody'는 내부에 전역 변수를 사용합니까? –

+0

예, 게시물에서 "전역 변수"라고 말하면 mtcbody 스크립트를 참조하고 있습니다. 내 장고 코드는 전역 변수를 사용하지 않습니다. – Moin

답변

2

왜이 동작을 설명하기가 어렵습니다. 스크립트는 한 번 실행 된 다음 종료되지만 서버 응용 프로그램은 영구적이므로 전역 데이터가 해당 응용 프로그램 내에서 지속되는 것은 놀라운 일이 아닙니다.

해결 방법은 분명해야합니다. 전역 변수를 사용하지 마십시오. 이상한 경우를 제외하고는 거의 도움이되지 않습니다. 을 수행하면은 실제로 데이터간에 통화가 지속되기를 원합니다. 특히 다른 사용자가 서로 다른 시간에 자원을 요청할 수있는 서버 환경에서 전역 변수는 위험합니다. 귀하의 경우 mtcbody 내의 관련 기능을 보지 않아도 조언하기가 어렵지만, 아마 클래스를 통해 해당 모듈 내의 데이터를 전달해야하는 것처럼 보입니다.

+0

질문을 게시하자마자 내 순진함을 깨달았습니다. 그럼에도 불구하고 대답은 도움이되었습니다. mtcbody 스크립트는 길다 (5000 줄). 오래 전에 다른 독자가 작성한 독립 실행 형 로컬 프로그램으로서, 웹을 통해 기능을 제공하는 것이다. mtcbody는 전역 변수에 많이 의존하기 때문에 완벽한 리팩터가 부족합니다. – Moin