如何在webapp2中将尾斜杠设为可选?
我正在使用新的 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 带可选前缀的讨论。
简短回答
我的路由模式适用于以下网址:
- /
- /feed
- /feed/
- /feed/create
- /feed/create/
- /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