使用webapp2元组请求处理程序(正则表达式,处理程序)

时间:2017-10-18 03:36:10

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

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

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

documentation并不能帮助我理解如何回答我的问题...

1 个答案:

答案 0 :(得分:0)

您可以随时在处理程序的get()代码中使用通用方法进行试用(您可以轻松地使用浏览器进行检查),因为无论正则表达式如何,它都可以正常运行拥有app的路由器:

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

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

通过这个,你可以确切地看到你得到的args以及如何/在哪里,所以你可以根据需要调整你的处理程序代码。如果更改正则表达式,则可能需要重复。

根据您发布的代码(即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错误。您需要首先使用最具体的模式交换路由器中路由定义的顺序。