self.response.out.write() - 如何正确使用它?

时间:2010-11-09 06:20:29

标签: python google-app-engine

我有一个不扩展webapp.RequestHandler的课程,我不能使用self.response.out.write(),我得到:

  

AttributeError:Fetcher实例没有属性'response'

如果我延长webapp.RequestHandler(我认为它会起作用),我得到:

  

AttributeError:'Fetcher'对象没有属性'response'

如何正确使用该方法?有时print也不起作用;我只是一个空白的屏幕。

修改

的app.yaml:

application: fbapp-lotsofquotes
version: 1
runtime: python
api_version: 1

handlers:
- url: .*
  script: main.py

来源(有问题的行标有#<- HERE):

import random
import os

from google.appengine.api import users, memcache
from google.appengine.ext import webapp, db
from google.appengine.ext.webapp import util, template
from google.appengine.ext.webapp.util import run_wsgi_app

import facebook


class Quote(db.Model):
    author = db.StringProperty()
    string = db.StringProperty()
    categories = db.StringListProperty()
    #rating = db.RatingProperty()


class Fetcher(webapp.RequestHandler):
    '''
    Memcache keys: all_quotes
    '''

    def is_cached(self, key):
        self.fetched = memcache.get(key)
        if self.fetched:
            print 'ok'#return True
        else:
            print 'not ok'#return False


    #TODO: Use filters!
    def fetch_quotes(self):
        quotes = memcache.get('all_quotes')
        if not quotes:
            #Fetch and cache it, since it's not in the memcache.
            quotes = Quote.all()
            memcache.set('all_quotes',quotes,3600)
        return quotes

    def fetch_quote_by_id(self, id):
        self.response.out.write(id) #<---------- HERE


class MainHandler(webapp.RequestHandler):

    def get(self):
        quotes = Fetcher().fetch_quotes()
        template_data = {'quotes':quotes}
        template_path = 'many.html'
        self.response.out.write(template.render(template_path, template_data))


class ViewQuoteHandler(webapp.RequestHandler):

    def get(self, obj):
        self.response.out.write('viewing quote<br/>\n')
        if obj == 'all':
            quotes = Fetcher().fetch_quotes()
            self.render('view_many.html',quotes=quotes)
        else:
            quotes = Fetcher().fetch_quote_by_id(obj)
            '''for quote in quotes:
                print quote.author
                print quote.'''


    def render(self, type, **kwargs):
        if type == 'single':
            template_values = {'quote':kwargs['quote']}
            template_path = 'single_quote.html'
        elif type == 'many':
            print 'many'

        self.response.out.write(template.render(template_path, template_values))


'''
CREATORS
'''
class NewQuoteHandler(webapp.RequestHandler):

    def get(self, action):
        if action == 'compose':
            self.composer()
        elif action == 'do':
            print 'hi'

    def composer(self):
        template_path = 'quote_composer.html'
        template_values = ''
        self.response.out.write(template.render(template_path,template_values))

    def post(self, action):
        author = self.request.get('quote_author')
        string = self.request.get('quote_string')
        print author, string

        if not author or not string:
            print 'REDIRECT'

        quote = Quote()
        quote.author = author
        quote.string = string
        quote.categories = []
        quote.put()


def main():
    application = webapp.WSGIApplication([('/', MainHandler),
                                          (r'/view/quote/(.*)',ViewQuoteHandler),
                                          (r'/new/quote/(.*)',NewQuoteHandler) ],
                                         debug=True)
    util.run_wsgi_app(application)


if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:2)

初始化Fetcher时,您未转到WSGIApplication。而是在其他处理程序中手动创建实例。因此,App Engine不会初始化您的requestresponse属性。您可以从路由到的处理程序手动执行此操作,例如MainHandlerViewQuoteHandler。 E.g:

fetcher = Fetcher()
fetcher.initialize(self.request, self.response)
quotes = fetcher.fetch_quotes()

请注意,fetcher实际上不一定是RequestHandler。它可以是一个单独的类或函数。一旦有了请求和响应对象,就可以根据需要传递它们。