2013-07-18 36 views
1

在最后几天,我看到了很多代码,例如GAE Boilerplate,几乎所有代码都使用路线来管理页面调用。我想知道为什么?官方的例子总是使用“正常”的方法:GAE:路线与标准

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,但是对于路由,可以调用相同的作品,但是当完成一篇文章时,它只适用于表单动作为/register/(最后一个斜杠)。

回答

3

通过原始webapp引入的主要功能之一webapp2恰恰是Route类提供的功能的扩展。

文档给出了它试图实现一个很好的解释:

webapp2的介绍,它扩展了Web应用程序的模型,以提供额外功能的路由机制:

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

  • 关键字参数:处理程序可以从匹配的URI接收关键字参数。这比使用位置参数更容易使用并且更加可靠。

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

Source

底线,他们是路由的一个更强大的版本,为程序员提供了更多的功能。


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

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

在第二种情况下,/lang/en_US,路由只匹配,因此处理程序仅在需要匹配的地方代替<lang>时才会调用。


根据斜线问题,您在路线中使用strict_slashmore here

+0

谢谢@Tomasz。我已阅读链接。只有2个注释:在某些情况下,似乎可以很好地使用(并检查)参数是否已经过去。例如,在'lang?hl = en_US'中,如果我没有找到它,我会抛出“Bad param”的消息。随着路线启动404错误。其次,根据strict_slash文档,调用'/ register'将重定向到'/ register /'。那么,为什么POST到'/ register'失败?但最后,调用'/ register'还是'/ register /'之间的区别,即为什么人们使用strict_slash? – Eagle

+0

@Eagle正确,无论是“lang?hl = en_US”还是“/ lang/en_US”都没有错 - 这取决于你,这对你的特定情况更有意义。 –

+0

@Eagle至于'POST'失败,(当你不清楚什么是和不能工作时),strict_slash'的效果是当请求的URL发出一个代码为“301”的响应(重定向)当预期有一个斜线时会丢失斜线,反之亦然。为'POST'发出重定向不是我期望在任何地方看到的模式,因为您应该已经使用最初的'GET'将浏览器重定向到正确的URL。这就是为什么我相信'webapp2.RedirectHandler'(webapp2的重定向实现的一部分)甚至没有实现'POST'处理程序。 –