2014-08-27 2 views
2

이 소리가 심하다.전역 상수 설정 모든보기를 교차

getattr(request, 'CONSTANT_NAME', None) 

그러나,이 변수의 값이 어떤 시점에서 변경 될 수 있습니다, 나는 다음과 같은 코드가 의미 : 나는 내 모든 의견을 수행하여 그 일정을 참조 할 수 있습니다 의미 요청에 전역 변수를 설정하려면 내보기 중 하나에 :

setattr(request, 'CONSTANT_NAME', VALUE) 

나는이 확실히 잘못된 일을하고있는 방법을 알고,하지만 난 내가 무엇을 찾고 달성하기 위해 정확하고 깨끗한 방법이 있는지 알고 싶습니다.

미들웨어에 대해 생각하고 있지만 어떻게해야할지 잘 모릅니다. 힌트만으로도 충분합니다.

미리 감사드립니다.

업데이트 : 누군가 세션에 대해 언급했습니다. 나는 그것이 작동해야한다고 확신한다. 그러나, 그것은 충분히 깨끗하지 못합니다. 세션을 사용하여 서버 유지 관리 세션의 총 수와 동일한 상수를 여러 번 만들어야합니다. 사실, 상수는 서버와 동일한 교차 지점을 유지하며 변경 가능해야합니다! 마지막 요구 사항은 불쾌한 부분입니다.

+0

Django 세션을 사용해 보셨습니까? 링크는 다음과 같습니다. https://docs.djangoproject.com/en/dev/topics/http/sessions/#bundled-serializers 세션에 변수를 가져오고 설정합니다. 또는 context_processor를 사용하여 뷰 전체에서 전역 변수를 사용할 수 있습니다. –

+0

최상의 접근 방식은 값이 의미하는 바와 사용 방법에 따라 달라집니다. 세션과 관련이있는 경우 세션 객체에 추가합니다. 그것이 다른 것이라면 다른 해결책이 필요할 수도 있습니다. – Louis

+0

@AronYsidoro 세션이 마지막 내기입니다. 내가 사용하고 싶지 않은 이유는 내 변수가 특정 세션이 아니라는 것입니다. 서버마다 다릅니다. 세션은 효과가 있지만 충분히 깨끗하지는 않습니다. 컨텍스트 프로세서는 옵션이 아닙니다. 컨텍스트 프로세서에 의해 제공되는 값을 변경한다고 생각하지 않습니다. –

답변

1

결국 미들웨어의 길을 택했습니다. 맞춤형 미들웨어를 작성하고 미들웨어에 변수를 설정했습니다.

CONSTANT_NAME = None 

전 세계입니다. 로컬 스레드 :

_thread_local = threading.local() 

또한 글로벌입니다.

그러면 I 미들웨어 두 방법, 어떤 뷰에서 호출 할 수

def get_constant_value() 
    return getattr(_thread_local, 'CONSTANT_NAME', None) 

def set_constant_value(value): 
    CONSTANT_NAME = value 

있다.

그런 다음 내 미들웨어 안에, 내가 설정하고 내가 원하는 모든보기에서이 서버 교차 변수를 가져올 호출이 시점에서
def process_request(self, request): 
    _thread_local.CONSTANT_NAME = CONSTANT_NAME 

있습니다.

해결책이 완벽하지 않습니다 (저는 믿습니다). 누구든지 더 좋은 아이디어가 있다면 알려주세요!

감사합니다.