这是在App Engine / Python中执行/处理url重写的正确方法吗?

时间:2010-11-07 08:47:05

标签: python google-app-engine url-rewriting

我不确定这是否有效。它有效,但有时我觉得......很奇怪。如果这是一个好方法,你能告诉我吗?

我把代码扔到了pastebin上,因为我觉得放在这里有点太多了:http://pastebin.com/662TiQLq

EDIT 我编辑了标题,使其更加客观。

1 个答案:

答案 0 :(得分:2)

我只是猜测提问者询问是否在处理程序的__ init __函数中创建函数字典,然后在“get”函数中使用此dict来查找特定函数。如果这是问题,那么恕我直言,更明确的方法是为每个不同的功能设置单独的处理程序。例如

class QuotesView(webapp.RequestHandler):
    """Super class for quotes that can accommodate common functionality"""
    pass

class QuotesViewSingle(QuotesView):
    def get(self):
        ...

class QuotesViewRandom(QuotesView):
    def get(self):
        ...

class QuotesViewAll(QuotesView):
    def get(self):
        ...

def main():
    application = webapp.WSGIApplication([('/quote/new',NewQuote),
                                          (r'/quotes/single',QuotesViewSingle),
                                          (r'/quotes/all',QuotesViewAll),
                                          (r'/quotes/random',QuotesViewRandom),
                                          ...
                                          ('/', MainHandler)],
                                         debug=True)

顺便说一句。很多人在WSGIApplication调用中使用正则表达式来解析get函数的参数。它没有什么特别的错误。我不是那个功能的忠实粉丝,而是喜欢解析get函数中的参数。但那只是我。

为了完整性,这里是原始代码:

class Quote(db.Model):
    author = db.StringProperty()
    string = db.StringProperty()


class MainHandler(webapp.RequestHandler):
    def get(self):
        user = users.get_current_user()


        quotes = Quote.all()
        path = os.path.join(os.path.dirname(__file__),'quotery.html')
        template_values = {'quotes':quotes,'user':user,'login_url':users.create_login_url('/')}
        self.response.out.write(template.render(path, template_values))


class QuoteHandler(webapp.RequestHandler):

    def __init__(self):
        self.actions = {'fetch':self.fetch, 'random':self.fetch_random}

        #Memcache the number of quotes in the datastore, to minimize datastore calls
        self.quote_count = memcache.get('quote_count')
        if not self.quote_count:
            self.quote_count = self.cache_quote_count()

    def cache_quote_count(self):
        count = Quote.all().count()
        memcache.add(key='quote_count', value=count, time=3600)
        return count


    def get(self, key):
        if key in self.actions:
            action = self.actions[key]
            action()




    def fetch(self):
        for quote in Quote.all():
            print 'Quote!'
            print 'Author: ',quote.author
            print 'String: ',quote.string
            print


    def fetch_random(self):
        max_offset = self.quote_count-1
        random_offset = random.randint(0,max_offset)
        '''self.response.out.write(max_offset)
        self.response.out.write('\n<br/>')
        self.response.out.write(random_offset)'''
        try:
            query = db.GqlQuery("SELECT * FROM Quote")
            quotes = query.fetch(1,random_offset)
            return quotes
            '''for quote in quotes:
                self.response.out.write(quote.author)
                self.response.out.write('\n')
                self.response.out.write(quote.string)'''
        except BaseException:
            raise


class NewQuote(webapp.RequestHandler):

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

        if not author or not string:
            return False        
        quote = Quote()
        quote.author = author
        quote.string = string
        quote.put()
        QuoteHandler().cache_quote_count()
        self.redirect("/")
        #return True


class QuotesView(webapp.RequestHandler):

    def __init__(self):
        self.actions = {'all':self.view_all,'random':self.view_random,'get':self.view_single}

    def get(self, key):
        if not key or key not in self.actions:
            self.view_all()
        if key in self.actions:
            action = self.actions[key]
            action()

    def view_all(self):
        print 'view all'

    def view_random(self):
        quotes = QuoteHandler().fetch_random()
        template_data = {}

        for quote in quotes:
            template_data['quote'] = quote

        template_path = os.path.join(os.path.dirname(__file__),'base_view.html')
        self.response.out.write(template.render(template_path, template_data))


    def view_single(self):
        print 'view single'


def main():
    application = webapp.WSGIApplication([('/quote/new',NewQuote),(r'/quotes/(.*)',QuotesView),(r'/quote/(.*)',QuoteHandler),('/', MainHandler)],
                                         debug=True)
    util.run_wsgi_app(application)