如何在webapp2中将尾斜杠设为可选?

19 投票
9 回答
5595 浏览
提问于 2025-04-17 10:05

我正在使用新的 webapp2(现在在 1.6 版本中是默认的 webapp),但我还没弄明白怎么让代码中的结尾斜杠变成可选的,像这样:

webapp.Route('/feed', handler = feed)

我试过 /feed/?/feed/*/feed\/*/feed\/?,但是都没有成功。

9 个回答

4

这是我处理这些路由的方法。

from webapp2 import Route
from webapp2_extras.routes import PathPrefixRoute
import handlers

urls = [
  Route('/foo<:/?>', handlers.Foo),
  Route('/bars', handlers.BarList),
  PathPrefixRoute('/bar', [
    Route('/', handlers.BarList),
    Route('/<bar_id:\w+><:/?>', handlers.Bar),
  ]),
]
...

需要注意的是,你的处理函数需要定义 *args**kwargs,这样才能处理可能出现的结尾斜杠,因为这个斜杠会通过这种方式作为参数传给它们。

class Bar(webapp2.RequestHandler):

  def get(bar_id, *args, **kwargs):
    # Lookup and render this Bar using bar_id.
    ...
7

我不喜欢 RedirectRoute 这个类,因为它会导致不必要的 HTTP 重定向
根据 webapp2 Route 类 的文档,这里有一个更详细的回答,来自这个 webapp2.Route 带可选前缀的讨论

简短回答

我的路由模式适用于以下网址:

  1. /
  2. /feed
  3. /feed/
  4. /feed/create
  5. /feed/create/
  6. /feed/edit/{entity_id}
SITE_URLS = [
    webapp2.Route(r'/', handler=HomePageHandler, name='route-home'),

    webapp2.Route(r'/feed/<:(create/?)|edit/><entity_id:(\d*)>',
        handler=MyFeedHandler,
        name='route-entity-create-or-edit'),

    webapp2.SimpleRoute(r'/feed/?',
        handler=MyFeedListHandler,
        name='route-entity-list'),
]

希望这对你有帮助 :-)

13

为了避免同一个页面出现重复的链接,你应该使用一个叫做RedirectRoute的东西,并把strict_slash设置为True。这样可以自动把/feed/这个链接重定向到/feed,具体做法如下:

from webapp2_extras.routes import RedirectRoute

route = RedirectRoute('/feed', handler=feed, strict_slash=True)

想了解更多,可以查看 http://webapp2.readthedocs.io/en/latest/api/webapp2_extras/routes.html

撰写回答