我正在尝试使用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无法处理?有什么不对吗?
答案 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}},在这种情况下)。