请求处理

问题描述:

编辑我的问题,因为它之前也不是很清楚。请求处理

代码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到 –

你总是可以做使用处理程序的代码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