2012-06-09 1 views
0

Google 애플리케이션 엔진 (Python)을 사용할 때 "요청 범위"에 일부 정보를 저장하고 싶습니다. 이것이 의미하는 바는 요청이 처음 수신되었을 때 일부 정보를 초기화 한 다음 요청의 수명 동안 (그리고 요청에 의해서만) 어디서나 액세스 할 수 있다는 것입니다.Google 애플리케이션 엔진의 "요청 범위"에 객체 저장

예를 들어 인증 후 요청 범위에 현재 사용자의 이름을 저장 한 경우입니다.

어떻게 이런 일을 할 것입니까?

감사합니다.

+0

어떤 프레임 워크를 사용하고 있습니까? 아마도 당신은 미들웨어를 원할 것입니다. – geoffspear

+0

프레임 워크가 없으며 단지 파이썬입니다. –

+0

그런 다음 CGI 스크립트 시작 부분에 로컬 변수 값을 설정하십시오. ('main()'이라는 함수를 정의하지 않으면 각 요청 후에 모든 것이 버려 질 것입니다.) – geoffspear

답변

2

앱 엔진 자체에서 사용되는 패턴은 threading.local인데 SDK 코드에서 grep 할 수 있습니다. os.environ 요청 로컬 만들기는 예를 들어 runtime/request_environment.py에서와 같이 수행됩니다.

거친 예 : 다른 곳에서

import threading 

class _State(threading.local): 
    """State keeps track of request info""" 
    user = None 

_state = _State() 

당신이 핸들러 코드 초기에 인증 할 수 있습니다. 이제 BaseHandler 클래스 모든 요청을 상속하는 경우

class BaseHandler(webapp2.RequestHandler): 
    #A function which is useful in order to determine whether user is logged in 
    def initialize(self, *a, **kw): 
    #Do the authentication 
    self.username = username 


class MainHandler(BaseHandler): 
def get(self): 
    print self.username 

- : 코드의 다른 부분에서 사용할 수있는

from state import _state 
if authentication_passed: 
    _state.user = user 

과 편리함을 제공하는이

from state import _state 
def get_authenticated_user(): 
    user = _state.user 
    if not user: 
     raise AuthenticationError() 
    return user 
1

는이 같은 뭔가가 필요 먼저 BaseHandler 클래스의 initialize 메서드를 수행하고 BaseHandler 클래스에서 사용자 이름을 으로 설정하고 MainHandler가 BaseHandler 폼을 상속받습니다. self.username이 정의되고 모든 요청은 initialize 메소드를 거치게됩니다.

+0

OP는 webapp2 프레임 워크를 사용하지 않기 때문에'webapp2.RequestHandler'를 서브 클래스 화하는 해결책은 아마도 isn이 아닙니다. 일하지 않을거야. – geoffspear

+1

그는 구글 앱 엔진을 사용하고 있습니다. 기본 구글 앱 엔진은 webapp2 모듈과 함께 제공됩니다. 그래서 나는 그에게 다음과 같은 대답을 제안했습니다. –

관련 문제