2


웹 응용 프로그램 페이지가 몇 가지 기본 메소드와 변수를 상속 할 수 있도록 base request handling 클래스를 정의하려고합니다. 그렇지 않으면 응용 프로그램의 각 페이지에 대해 반복적으로 정의해야합니다. django preprocessors와 비슷한 종류의 기능. 이것은 다른 페이지가 상속하는 내 기본 클래스입니다.Google App Engine, 전처리 클래스 정의

class BasePage(webapp.RequestHandler): 
    def __init__(self):  
     self.user = users.get_current_user()  
     self.template_values = { 
       'user': self.user,  
       'environ': self, #I don't like the idea of passing the whole environ object to a template 

       ##The below three functions cannot be executed during _init_ because of absence of self.request 
       #'openid_providers': self.openid_providers(), 
       #'logout_url': self.get_logout_url(), 
       #'request': self.get_request(), 
      }   

    ##A sort of similar functionality like render_to_response in django 
    def render_template(self, template_name, values = None, *args, **kwargs): 
     #PATH is the directory containing the templates 
     if values: 
      for value in values: self.template_values[value] = values[value] 
     self.response.out.write(template.render(PATH+template_name, self.template_values, *args, **kwargs))     

    ##Returns request as the name suggests 
    def logout_url(self): 
     return users.create_logout_url(self.request.url) 

    ##Returns request as the name suggests 
    def request(self): 
     return request 

    ##Returns openid login urls   
    def openid_providers(self): 
     #OPENID_POVIDERS is a list of dictionary 
     for p in OPENID_PROVIDERS: 
      p['login_url'] = users.create_login_url(self.request.get('next', '/') , p['name'], p['url']) 
     return OPENID_PROVIDERS 

self.request를 사용할 수 없으므로 초기화 중에 일부 변수를 전달할 수 없다는 점을 제외하면 모든 것이 잘 작동합니다. 그래서 해결 방법은 내가 한 일은 전체 자체 변수를 템플릿 변수로 전달하는 것입니다.

템플릿 변수 (request, logout_url 등)를 템플릿에 제공하는 다른 방법이 있습니까?

답변

2

나는 기본적으로 Template Method Pattern

를 사용하여 내 AppEngine에 코드에서 그 문제를 해결 한, 기본 클래스 보인다 그 DoGet()DoPost() 방법의 배짱.

+0

감사합니다. 나는 커스텀 get, posts를 기본 클래스에 정의하고 super()를 사용하는 줄에서 생각하고 있었다. 그러나이 DoPost, DoGet은 훌륭하게 보인다 !! 나는 이것이 많은 장고 기능을 필요로하지 않는 나의 작은 프로젝트에 좋은 것이라고 생각한다. – crodjer

+0

@dcrodjer - 우수! – bgporter

5

방법의 일반적인 설정을 수행하는 것이 bgporter보다 훨씬 간단합니다. webapp.RequestHandler입니다. 전에,이 방법은 어에라고

class BaseHandler(webapp.RequestHandler): 
    def initialize(self, request, response): 
     super(BaseHandler, self).initialize(request, response) 
     # Add a Django-like is_ajax() method to the request object 
     request.is_ajax = lambda: \ 
      request.environ.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest' 

현재 요청과 응답 객체와 각 요청 핸들러를 초기화 : 여기에 우리가 요청 개체에 장고와 같은 is_ajax 방법을 추가하고 싶었 작업의 예입니다 적절한 get 또는 post (또는 무엇이든) 메소드가 호출됩니다.

+0

+1 - 좋은; 그것을 결코 고려하지 않았습니다. – bgporter

+0

네가 어떻게 이런 일을 할 수 있는지는 분명하지 않다. 왜 핸들러가 똑같은 일을하기 위해'__init__ '을 사용하지 않는지 정확히 나는 확신하지 못합니다. –

+0

멋진 솔루션 @will! – crodjer