在最后几天,我看到很多代码,比如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/
(最后一个斜杠)时才有效。
答案 0 :(得分:3)
原始webapp2
引入的一个主要功能webapp
正是Route类提供的功能扩展。
该文档对其尝试实现的目标给出了很好的解释:
webapp2引入了一种扩展webapp模型的路由机制,以提供其他功能:
URI构建:可以在需要时构建已注册的路由,从而避免在应用程序代码和模板中使用硬编码的URI。如果在开发期间以兼容的方式更改路由定义,则使用该路由的所有位置将继续指向正确的URI。这样不容易出错,也更容易维护。
关键字参数:处理程序可以从匹配的URI中接收关键字参数。这比位置参数更容易使用,也更容易管理。
嵌套路由:可以扩展路由以匹配多于请求路径。我们将在下面看到一个也可以匹配域和子域的路由类。
最重要的是,它们是更强大的路由版本,为程序员提供了更多功能。
根据您的具体参数问题,您无需以任何特定方式传递lang
。在第一种情况下,lang
将作为request.GET
的一部分提供,在第二种情况下,作为请求处理程序的方法的位置参数,与请求方法匹配(GET
,{{1 }})。
差别很大,在POST
的情况下,参数在技术上是可选的。即使参数不存在,您的请求仍将与处理程序匹配,因此您必须验证/lang?hl=en_US
是否包含数据。
在第二种情况下,request.GET
,路由仅匹配,因此只有在匹配/lang/en_US
时才会调用处理程序。
根据斜杠问题,您在路线中使用<lang>
。 more here