Google App Engine(Python)app.yaml urlhandler不起作用

时间:2013-04-11 16:50:45

标签: google-app-engine handlers app.yaml

我正在尝试使用python27的谷歌应用引擎。

    handlers:
    - url: /favicon\.ico
      static_files: favicon.ico
      upload: favicon\.ico

    - url: /hello
      script: helloworld.app

    - url: /.*
      script: main.app

helloworld.py和main.app与官方文档中的代码相同,但差别很小(响应字符串)。

import webapp2
class MainHandler(webapp2.RequestHandler):
    def get(self):
        self.response.write('Hello world!!!')
app = webapp2.WSGIApplication([
    ('/', MainHandler)
], debug=True)

我的结果: 1.“〜”,响应来自“main.app”。 2.“〜/ favicon.ico”,回复来自“favicon.ico”。 3.“〜/ hello”,响应为“404”。 4.“〜/ something”,回复是“404”。

抱歉,发布此问题,“〜”代表"http://localhost:8080"

为什么3和4无法处理?有什么不对吗?

1 个答案:

答案 0 :(得分:3)

尝试将('/', MainHandler)更改为(r'/.*', MainHandler)r只表示它是原始字符串)。问题是您目前没有任何处理程序用于除根/之外的任何其他处理程序,因此具有其他参数(例如http://localhost:8080/hello)的请求没有匹配的处理程序,因此不知道如何处理它。将处理程序更改为/.*意味着所有请求(无论根目录后的内容)都应该路由到MainHandler

对于app.yaml文件中的*.py处理程序和处理程序,请将app.yaml视为高级主管。它获取一个请求并简单地确定将其发送到哪里(我是否收到了静态Javascript文件的请求?CSS?图片?或者这是一个应该为页面提供服务的请求等?)。在上述情况下,您希望它在点击任何非/favicon的网址时服务于特定网页(所以/.*),因此它所做的就是将任何请求发送到{{1}并将其路由到/.*,这位于您的main.app文件中(我现在忽略main.py,主要是因为在您的情况下您不一定需要它)。

然后,更细粒度的处理发生 - helloworld.app接收原始请求,然后它查找执行代码的特定处理程序。当我们将处理程序更改为main.app时,它会匹配任何内容(所以r'/.*'//hello等),并执行相应的类{{ 1}},在这种情况下)。