I\'m using the new webapp2 (now the default webapp in 1.6), and I haven\'t been able to figure out how to make the trailing slash optional in code like this:
web
This works for me and is very simple. It uses the template format for URI routing in the webapp2 Route class. Trailing slash in this example is optional with no redirection:
webapp2.Route('/your_url<:/?>', PageHandler)
Everything after the colon between the chevrons is considered to be a regex: <:regex>
I don't like the RedirectRoute
class because it causes an unnecessary HTTP Redirect.
Based on the documentation for webapp2 Route class, here is a more detailed answer in this webapp2.Route with optional leading part thread.
Short Answer
My route patterns works for the following URLs.
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'),
]
Hope it helps :-)
Here's how I handle these routes.
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),
]),
]
...
It's important to note that your handlers will need to define *args
and **kwargs
to deal with the potential trailing slash, which gets sent to them as an argument using this method.
class Bar(webapp2.RequestHandler):
def get(bar_id, *args, **kwargs):
# Lookup and render this Bar using bar_id.
...