【问题标题】:request handlers using webapp2 tuple(regex, handler)使用 webapp2 元组的请求处理程序(正则表达式,处理程序)
【发布时间】:2018-03-29 20:48:45
【问题描述】:

编辑了我的问题,因为之前不是很清楚。

代码 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) 与代码 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(self, id=none) 更改为 get(self, id=none, argument3=none)?来自 C++,我一直认为这就像一个带有 3 个参数的函数调用需要一个带有 3 个参数的函数头来保存这些参数。我完全误解了事情吗?

documentation 无法帮助我理解如何回答我的问题...

【问题讨论】:

标签: regex python-2.7 google-app-engine webapp2


【解决方案1】:

您始终可以在处理程序的get() 代码中使用通用方法进行试验(您可以使用浏览器轻松检查),因为无论您在app 中使用的正则表达式模式如何,它都应该可以工作的路由器:

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

路由器的工作方式与put() 相同,因此您可以应用类似的方法,只是很难立即看到结果 - 您必须使用日志记录并检查应用程序的日志。

通过它,您可以准确地看到您获得的参数以及如何/在哪里,因此您可以根据需要调整您的处理程序代码。如果您更改正则表达式模式,您可能需要重复。

使用您发布的代码(即def put():),它根本不应该工作,因为id 未初始化。这意味着您可能忘记了所做的更改。

对我来说put(self, id=None): 是正确的,应该适用于其中包含单个 () 组的任何模式。

你没有准确解释stopped working 是什么意思 :) 我有两个怀疑:

  • 您没有更改实际请求以匹配模式。我的意思是 boats/&lt;some_safe_url&gt; 请求将匹配 '/boats/([\w-]+)' 模式,但将失败 '/boats/([\w-]+)/at_sea' 模式。您会看到 404 错误。

  • 您希望在AtSeaHandler 上收到请求,但实际上您在BoatHandler 上收到了它(也许您没有注意到)。这是因为boats/&lt;some_safe_url&gt;/at_sea 模式也匹配'/boats/(.*)' 模式并且路由器选择第一个匹配项。这种意外匹配还会产生无效的id:&lt;some_safe_url&gt;/at_sea,它将无法为您提供密钥,从而无法获得船——再次出现 404 错误,或者简单的崩溃——500 错误。您需要交换路由器中路由定义的顺序,首先使用最具体的模式。

【讨论】:

  • 谢谢!我没有意识到路由顺序和 (.*) 导致了我的问题。现在它起作用了!我在网上遇到的所有事情都没有按路线定义的顺序强调,我也没有意识到 (.*) 是如何吞噬之后发生的事情的。当我将 (.*) 替换为 ([/w-]+) ('/boats/([\w-]+)/at_sea', AtSeaHandler), ('/boats/([\w -]+)', BoatHandler)
猜你喜欢
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 2011-01-21
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多