2017-10-18 182 views
1

編輯我的問題,因爲它之前也不是很清楚。請求處理

代碼1工作

​​

代碼2(不工作)

class AtSeaHandler(webapp2.RequestHandler): 
    def get(self, id=None): 
     boat = ndb.Key(urlsafe=id).get() 
     boat_dict = boat.to_dict() 
     boat_dict['self'] = "/boats/" + id 
     self.response.write(json.dumps(boat_dict) 

app = webapp2.WSGIApplication(
     ('/boats/([\w-]+)/at_sea', AtSeaHandler) 
     ], debug=True) 

代碼2是代碼1。只有代碼1和代碼之間的差異副本2是代碼1是('/ boats /([\ w-] +)',AtSeaHandler)與代碼2是('/ boats /([\ w-] +)/ at_sea',AtSeaHandler)。然後我註釋掉的代碼1.

碼1級的作品。代碼2不適用於添加的/ at_sea。我在郵遞員中輸入了http://localhost:8080/boats/aghkZXZ-Tm9uZXIRCxIEQm9hdBiAgICAgPCLCww,並驗證代碼1有效。還測試了代碼2並驗證它不起作用。

什麼我需要做的就是這個工作?當我通過boat實體鍵([\ w - ] +)和我def get(self, id=None):id給出船的實體鍵。 at_sea是否需要get()中的參數?我需要的get()從GET(個體經營,ID =無)來獲得改變(個體經營,ID =無,參數3 =無)?從C++來看,我一直認爲它就像一個帶有3個參數的函數調用,需要一個帶有3個參數的函數頭來保存這些參數。我完全誤解了一些事情嗎?

documentation並沒有幫助我瞭解如何回答我的問題...

+0

燁,我的第一個懷疑是正確的:嘗試的http://本地主機:8080 /船/ aghkZXZ-Tm9uZXIRCxIEQm9hdBiAgICAgPCLCww/at_sea到 –

回答

0

你總是可以做使用處理程序的代碼get()(whcih您可以輕鬆地瀏覽器來查看)的通用方法試訓,在這個意義上,它應該無論工作,你在app的路由器有正則表達式的:

def get(self, *args, **kwargs): 
     self.response.write('args: %s<br>kwargs: %s' % (args, kwargs)) 

的路由器工作在put()以同樣的方式,所以你可以申請一個類似的方法,只是這是一個有點更難以立即看到結果 - 你會h大家使用日誌記錄並檢查應用程序的日誌。

有了這個,你看到什麼ARG遊戲你和如何/在哪裏,所以您可以根據需要調整你的處理程序代碼。如果更改正則表達式模式,則可能需要重複。

由於您發佈的代碼(即def put():),它應該根本無法工作,因爲id未初始化。這意味着您可能會失去跟蹤您的更改。

對我來說put(self, id=None):是正確的,應該適用於任何模式與()組中。

你根本解釋不清楚你是什麼意思stopped working :)我有2個疑慮:

  • 你沒有改變實際要求相匹配的模式。我的意思是boats/<some_safe_url>請求將匹配'/boats/([\w-]+)'模式,但會失敗'/boats/([\w-]+)/at_sea'模式。你會看到一個404錯誤。

  • 您對AtSeaHandler的預期請求,但您實際上在BoatHandler(也許您沒有注意到)獲得該請求。發生這種情況是因爲boats/<some_safe_url>/at_sea模式也與'/boats/(.*)'模式匹配,並且路由器選擇第一個匹配項。這個意想不到的匹配也會產生一個無效的id<some_safe_url>/at_sea,它將無法讓你獲得一把鑰匙,從而導致一艘船 - 也是一個404錯誤,或者是一場普通的崩潰 - 一個500錯誤。您需要交換路由器中路由定義的順序,並使用最具體的模式。

+0

感謝匹配的新格局!我沒有意識到路由順序和(。*)導致我的問題。現在它工作了!我在網上遇到的所有事情都沒有按照路由定義的順序強調,我也沒有意識到(。*)如何吞噬之後的事情。 以下順序實際上,當我替換工作([/瓦特 - ] +)(。*) ( '/船艇/([\ W - ] +)/ at_sea',AtSeaHandler)\t ('/ boat /([\ w - ] +)',BoatHandler) – NoobProgrammer