使用 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 错误。您需要交换路由器中路由定义的顺序,首先使用最具体的模式。