请求处理
编辑我的问题,因为它之前也不是很清楚。请求处理
代码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并没有帮助我了解如何回答我的问题...
你总是可以做使用处理程序的代码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错误。您需要交换路由器中路由定义的顺序,并使用最具体的模式。
感谢匹配的新格局!我没有意识到路由顺序和(。*)导致我的问题。现在它工作了!我在网上遇到的所有事情都没有按照路由定义的顺序强调,我也没有意识到(。*)如何吞噬之后的事情。 以下顺序实际上,当我替换工作([/瓦特 - ] +)(。*) ( '/船艇/([\ W - ] +)/ at_sea',AtSeaHandler)\t ('/ boat /([\ w - ] +)',BoatHandler) – NoobProgrammer
烨,我的第一个怀疑是正确的:尝试的http://本地主机:8080 /船/ aghkZXZ-Tm9uZXIRCxIEQm9hdBiAgICAgPCLCww/at_sea到 –