Google App Engine 重写问题

4 投票
3 回答
613 浏览
提问于 2025-04-16 16:22

我想知道怎么把这个网址改写成另一个格式:

http://localhost:8081/?page=1

变成:

http://localhost:8081/1

这是我写的代码,但它没有正常工作:

class MainPage(webapp.RequestHandler):
    def get(self, page):
        mypage = self.request.get('page')
        self.response.headers['Content-Type'] = 'text/plain'
        if mypage == "":
            self.response.out.write('Hello, webapp World!')
        else:
            self.response.out.write('page is ' + mypage)


application = webapp.WSGIApplication([('/', MainPage),('/(\d+)', MainPage)], debug=True)

3 个回答

1

你为你的 MainPage 处理器定义了两个路径,一个是没有参数的路径 ('/'),另一个是带有一个参数的路径 ('/(\d+)')。但是,你的处理器实际上需要一个名为 page 的参数。

所以,你要么需要使用两个不同的处理器,要么给 page 参数设置一个默认值,像这样:

class MainPage(webapp.RequestHandler):
    def get(self, page=None):
        if not page:
          self.redirect('/%s', self.request.get('page'))
          return
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write('page is ' + mypage)

另外,以后如果你遇到错误信息(stacktrace),记得把它放在你的提问里!仅仅说“它不工作”让我们去猜到底出了什么问题,这样不容易得到有用的答案。

1

假设你正在使用网页应用:

class Rewriter(webapp.RequestHandler):
    def get(self):
        self.redirect(self.request.get('page'))

application = webapp.WSGIApplication([('/', Rewriter)],)
def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()
4

你可以在你的控制器中使用正则表达式。这并不是严格意义上的Apache风格的URL重写,但它能完成任务。重写后的参数会作为一个参数传递给处理程序。

class MyRequestHandler(webapp.RequestHandler):
    def get(self, page):
        self.response.headers['Content-Type'] = 'text/plain'
        if not page:
            self.response.out.write('Hello, webapp World!')
        else:
            self.response.out.write('page is ' + page)

url_map = [('/(\d+)', MyRequestHandler)]
application = webapp.WSGIApplication(url_map, debug=True)

可以参考 如何配置app.yaml以支持类似/user/<user-id>的URL?,了解类似的应用。

撰写回答