2013-04-11 55 views
3

我正在嘗試谷歌應用程序引擎與python27。谷歌App Engine(Python)app.yaml urlhandler不起作用

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.「〜/你好」,迴應是「404」。 4.「〜/ something」,響應是「404」。

對不起,要發佈這個問題,「〜」爲"http://localhost:8080"

爲什麼3和4不能處理?有什麼不對?

回答

3

嘗試更改('/', MainHandler)(r'/.*', MainHandler)(該r只是表示它是一個原始字符串)。問題是您目前沒有任何處理程序來處理根目錄/以外的任何其他處理程序,因此具有其他參數(例如http://localhost:8080/hello)的請求沒有匹配的處理程序,因此未知如何處理它。將處理程序更改爲/.*意味着所有請求(不管根後面是什麼)應該路由到您的MainHandler

至於app.yaml處理程序和*.py文件中的處理程序,請將app.yaml視爲高級主管。它得到一個請求,並簡單地決定將它發送到哪裏(我是否收到一個靜態JavaScript文件的請求?CSS?Picture?或者這是一個請求,應該爲頁面提供服務等)。在上述情況下,您希望它在點擊不是/favicon(因此/.*)的URL時提供特定頁面,因此它所做的是請求/.*並將其路由到main.app,它位於您的main.py文件(我現在忽略helloworld.app,主要是因爲在你的情況下你不一定需要它)。

然後,更細粒度的處理髮生 - main.app接收到原始請求,然後它尋找特定的處理程序來執行代碼。當我們將您的處理程序更改爲r'/.*'時,它會匹配所有內容(例如//hello,/helloworld等),並在此情況下執行相應的類MainHandler

+0

非常感謝,問題已解決。我將閱讀更多內容,找出app.yaml和* .py中兩個處理程序之間的差異。 – Babeler 2013-04-11 17:11:27

+0

@Babeler沒問題,很高興幫助:)查看http://webapp-improved.appspot.com/guide/routing.html,它是webapp2關於URL路由的文檔(您使用的是webapp2框架)。我在答案中增加了一些細節,希望能夠有所幫助。祝你一切順利。 – RocketDonkey 2013-04-11 17:32:11