2014-02-13 2 views
0

Привет я следующий код в Google Appengine.When получить из rot13 называется я получаю следующее сообщение об ошибке:Наследование webapp2 ошибки в Google App Engine

handler = self.handler(request, response)

TypeError: init() takes exactly 1 argument (3 given)

class BaseHandler(webapp2.RequestHandler): 
    def no_caches(self): 
     self.response.headers["Pragma"]="no-cache" 
     self.response.headers["Cache-Control"]="no-cache, no-store, must-revalidate, pre-check=0, post-check=0" 
     self.response.headers["Expires"]="Thu, 01 Dec 1994 16:00:00" 

    def render_str(self,template,**params): 
     t=jinja_env.get_template(template) 
     return t.render(params) 

    def render(self,template,**kw): 
     self.response.out.write(self.render_str(template,**kw)) 

    def write(self,*a,**kw): 
     self.response.out.write(*a,**kw) 

class Rot13(BaseHandler): 

    def __init__(self): 
    #BaseHandler.__init__(self) not working too 
    self.no_caches()   

    file='rto13.html' 

    def convert_rto13(self,s): 
     return s.encode('rot13') 

    def get(self): 
     self.render(self.file,text='',status='welcome') 

    def post(self): 
    text=self.request.get('text') 
    if not text: 
     return self.render(self.file,text='',status='You have to enter something') 
    rot13=self.convert_rto13(text) 
    self.render(self.file,text=rot13,status='translated') 

ответ

2

Как the documentation for RequestHandler показывает, что принимает два аргумента: запрос и ответ. Ваш __init__ должен принять их тоже, или даже лучше принять *args, **kwargs, и передать их на суперкласс.

+0

Спасибо.Большие ответы правильны. Если я хочу, чтобы Rot13 всегда выполнял no_caches из BaseHandler всякий раз, когда вызывается Rot13, есть ли лучший способ сделать это? – Atul

2

Вы не можете над оседлать __ init __ обработчик для RequestHandler в вашем BaseHandler, если вы не принимаете все его аргументы, и вы называете супер. Просто слепо переопределить __ init __ метод, не исследуя, что он делает в родительском классе, является рецептом проблем - следовательно, ваша проблема.

RequestHandler для webapp2 документирован. https://webapp-improved.appspot.com/api/webapp2.html#webapp2.RequestHandler

В частности, она говорит class webapp2.RequestHandler(request=None, response=None)

таким образом метод инициализации в rot13, который переопределяет BaseHandler должен выглядеть

def __init__(self,request,response): 
    super(Rot23,self).__init__(request,response) 
    # more stuff here. 
+0

Thanks.It работал. – Atul

0

Проблема заключается в функции no_caches().

def no_caches(self): 
    self.response.headers["Pragma"]="no-cache" 
    self.response.headers["Cache-Control"]="no-cache, no-store, must-revalidate, pre-check=0, post-check=0" 
    self.response.headers["Expires"]="Thu, 01 Dec 1994 16:00:00" 

При вводе нескольких заголовков вместо этого используйте вместо этого addheaders (поле, значение).

def no_caches(self): 
    self.response.headers["Pragma"]="no-cache" 
    self.response.headers.add_header("Cache-Control","no-cache, no-store, must-revalidate, pre-check=0, post-check=0") 
    self.response.headers.add_header("Expires","Thu, 01 Dec 1994 16:00:00") 

https://developers.google.com/appengine/docs/python/tools/webapp/redirects

+0

Нет проблемы в том, что ОП является переопределением init и никогда не вызывает его int he parent и не принимает правильное количество аргументов. –

Смежные вопросы