1

最近几天看到很多代码,比如GAE Boilerplate,几乎都是用Routes来管理页面调用。我想知道为什么?官方的例子总是使用“正常”的方法:

app = webapp2.WSGIApplication([('/', MainPage),
                               ('/lang', ChangeLanguage)], debug=True)

但现在我发现了这个替代方案:

from webapp2_extras.routes import RedirectRoute

RedirectRoute('/lang/<lang>', ChangeLanguage, name='lang', strict_slash=True),
RedirectRoute('/', MainPage, name='home', strict_slash=True)

在第一种情况下,我使用参数在请求中传递我的变量(如/lang?hl=en_US),而在第二种情况下,我必须将其作为路径传递(如/lang/en_US)。

但是为什么要使用一种方法呢?有什么优势吗?

另外,我注意到使用第一种方法可以在 get 和 put 方法中调用我的表单,例如,/register但是使用路由,get 调用相同的工作,但是当一个帖子完成时,它只有在表单动作是/register/(带有最后一个斜杠)。

4

1 回答 1

3

webapp2在原始版本上引入的主要功能之一webapp正是 Route 类提供的功能扩展。

该文档很好地解释了它试图实现的目标:

webapp2 引入了一种路由机制,扩展了 webapp 模型以提供附加功能:

  • URI 构建:可以在需要时构建注册的路由,避免在应用程序代码和模板中硬编码 URI。如果您在开发过程中以兼容的方式更改路由定义,则使用该路由的所有位置将继续指向正确的 URI。这不太容易出错并且更容易维护。

  • 关键字参数:处理程序可以从匹配的 URI 接收关键字参数。这比位置参数更容易使用,也更易于维护。

  • 嵌套路由:可以扩展路由以匹配比请求路径更多的路径。我们将在下面看到一个也可以匹配域和子域的路由类。

资源

归根结底,它们是更强大的路由版本,为程序员提供了更多功能。


根据您的特定参数问题,您不必通过lang任何特定方式。在第一种情况下,lang可以作为 的一部分,在第二种情况下,作为与请求方法 ( , )request.GET匹配的请求处理程序方法的位置参数。GETPOST

不同之处主要在于,在 的情况下/lang?hl=en_US,参数在技术上是可选的。即使参数不存在,您的请求仍将与处理程序匹配,因此您必须验证request.GET包含数据。

在第二种情况下,/lang/en_US仅匹配路由,因此仅当有匹配的内容代替时才调用处理程序<lang>


根据斜杠问题,您strict_slash在路线中使用。更多在这里

于 2013-07-18T09:26:45.480 回答