我正在学习 webapp2 框架及其强大的 Route 机制。

我的应用程序应该接受这样的 URI:

/poll/abc-123
/poll/abc-123/
/poll/abc-123/vote/       # post new vote
/poll/abc-123/vote/456    # view/update a vote

民意调查可以选择组织成类别,因此以上所有内容也应该像这样工作:
/mycategory/poll/abc-123
/mycategory/poll/abc-123/
/mycategory/poll/abc-123/vote/
/mycategory/poll/abc-123/vote/456

我的错误配置:
app = webapp2.WSGIApplication([
    webapp2.Route('/<category>/poll/<poll_id><:/?>', PollHandler),
    webapp2.Route('/<category>/poll/<poll_id>/vote/<vote_id>', VoteHandler),
], debug=True)

问题: 如何修复我的配置?

如果可能,它应该针对 GAE CPU 时间/托管费用进行优化。例如,如果我为每个条目添加两行可能会更快:一行有类别,另一行没有类别......

最佳答案

webapp2 有一种机制可以重用公共(public)前缀,但在这种情况下它们会有所不同,因此您无法避免重复这些路由,如下所示:

app = webapp2.WSGIApplication([
    webapp2.Route('/poll/<poll_id><:/?>', PollHandler),
    webapp2.Route('/poll/<poll_id>/vote/<vote_id>', VoteHandler),
    webapp2.Route('/<category>/poll/<poll_id><:/?>', PollHandler),
    webapp2.Route('/<category>/poll/<poll_id>/vote/<vote_id>', VoteHandler),
], debug=True)

您不必担心添加许多路由。它们的构建和匹配成本非常低。除非您有数以万计的路由,否则减少路由数量无关紧要。

一个小说明:第一条路线接受一个可选的结束斜线。您可以改为使用 RedirectRoute 仅接受一个,并在访问另一个时重定向,使用选项 strict_slash=True 。这没有得到很好的记录,但已经存在了一段时间。请参阅 explanation in the docstring

关于google-app-engine - webapp2.Route 带有可选的前导部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7049871/

10-10 15:27