使用 webapp2 元组(正则表达式,处理程序)的请求处理程序
request handlers using webapp2 tuple(regex, handler)
编辑了我的问题,因为之前不是很清楚。
代码 1 有效
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-]+)', AtSeaHandler)
], debug=True)
代码 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) vs 代码 2 是 ('/船/([\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(self, id=none) 更改为 get(self, id=none, argument3=none)?来自 C++,我一直认为它就像一个带有 3 个参数的函数调用需要一个带有 3 个参数的函数头来保存这些参数。我完全误解了事情吗?
documentation 没有帮助我理解如何回答我的问题...
您始终可以在处理程序的 get()
代码中使用通用方法进行试用(您可以轻松地用浏览器检查),因为无论您使用的正则表达式模式如何,它都应该可以工作app
的路由器:
def get(self, *args, **kwargs):
self.response.write('args: %s<br>kwargs: %s' % (args, kwargs))
路由器的工作方式与 put()
相同,因此您可以应用类似的方法,只是很难立即看到结果 - 您必须使用日志记录并检查应用程序的日志。
有了这个,您可以准确地看到您获得的参数和 how/where,因此您可以根据需要调整您的处理程序代码。如果您更改正则表达式模式,您可能需要重复。
使用您发布的代码(即 def put():
)它根本不应该工作,因为 id
未初始化。这意味着您可能忘记了您的更改。
对我来说 put(self, id=None):
是正确的,应该适用于任何包含 单个 ()
组的模式。
你没有准确解释你所说的 stopped working
是什么意思 :) 我有两个怀疑:
您没有更改实际请求以匹配模式。我的意思是 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 错误。您需要交换路由器中路由定义的顺序,首先使用最具体的模式。
编辑了我的问题,因为之前不是很清楚。
代码 1 有效
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-]+)', AtSeaHandler)
], debug=True)
代码 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) vs 代码 2 是 ('/船/([\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(self, id=none) 更改为 get(self, id=none, argument3=none)?来自 C++,我一直认为它就像一个带有 3 个参数的函数调用需要一个带有 3 个参数的函数头来保存这些参数。我完全误解了事情吗?
documentation 没有帮助我理解如何回答我的问题...
您始终可以在处理程序的 get()
代码中使用通用方法进行试用(您可以轻松地用浏览器检查),因为无论您使用的正则表达式模式如何,它都应该可以工作app
的路由器:
def get(self, *args, **kwargs):
self.response.write('args: %s<br>kwargs: %s' % (args, kwargs))
路由器的工作方式与 put()
相同,因此您可以应用类似的方法,只是很难立即看到结果 - 您必须使用日志记录并检查应用程序的日志。
有了这个,您可以准确地看到您获得的参数和 how/where,因此您可以根据需要调整您的处理程序代码。如果您更改正则表达式模式,您可能需要重复。
使用您发布的代码(即 def put():
)它根本不应该工作,因为 id
未初始化。这意味着您可能忘记了您的更改。
对我来说 put(self, id=None):
是正确的,应该适用于任何包含 单个 ()
组的模式。
你没有准确解释你所说的 stopped working
是什么意思 :) 我有两个怀疑:
您没有更改实际请求以匹配模式。我的意思是
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 错误。您需要交换路由器中路由定义的顺序,首先使用最具体的模式。