graficos - grafico de barras python
¿Cómo hago una barra inclinada opcional con webapp2? (9)
Así es como manejo estas rutas.
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),
]),
]
...
Es importante tener en cuenta que sus manejadores necesitarán definir *args
y **kwargs
para lidiar con la barra diagonal potencial, que se les envía como un argumento usando este método.
class Bar(webapp2.RequestHandler):
def get(bar_id, *args, **kwargs):
# Lookup and render this Bar using bar_id.
...
Estoy usando la nueva aplicación web2 (ahora la aplicación web predeterminada en 1.6), y no he podido averiguar cómo hacer que la barra inclinada sea opcional en un código como este:
webapp.Route(''/feed'', handler = feed)
He intentado /feed/?
, /feed/*
, /feed//*
y /feed//?
, todo fue en vano.
Estaba buscando una manera de hacer que la barra diagonal de seguimiento en la raíz de un bloque PathPrefixRoute sea opcional.
Si tienes, di:
from webapp2_extras.routes import RedirectRoute, PathPrefixRoute
from webapp2 import Route
app = webapp2.WSGIApplication([
PathPrefixRoute(''admin'', [
RedirectRoute(''/'', handler=''DashboardHandler'', name=''admin-dashboard'', strict_slash=True),
RedirectRoute(''/sample-page/'', handler=''SamplePageHandler'', name=''sample-page'', strict_slash=True),
]),
])
Podrás acceder a /admin/
, pero no a /admin
.
Como no pude encontrar una solución mejor, agregué un redirect_to_name
a una ruta adicional, como:
from webapp2_extras.routes import RedirectRoute, PathPrefixRoute
from webapp2 import Route
app = webapp2.WSGIApplication([
Route(''admin'', handler=''DashboardHandler'', name=''admin-dashboard''),
PathPrefixRoute(''admin'', [
RedirectRoute(''/'', redirect_to_name=''admin-dashboard''),
RedirectRoute(''/sample-page/'', handler=''SamplePageHandler'', name=''sample-page'', strict_slash=True),
]),
])
Estoy interesado en mejores soluciones a este problema.
¿Debo optar por la solución de Stun y simplemente no usar RedirectRoute?
Esto funciona para mí y es muy simple. Utiliza el formato de plantilla para el enrutamiento URI en la class ruta webapp2. La barra diagonal final en este ejemplo es opcional sin redirección:
webapp2.Route(''/your_url<:/?>'', PageHandler)
Todo después de los dos puntos entre los chevrones se considera una expresión regular: <:regex>
No estoy familiarizado con webapp2, pero si el primer parámetro es una expresión regular, intente:
/feed(/)?
No me gusta la clase RedirectRoute
porque causa un redireccionamiento HTTP innecesario.
En base a la documentación para la clase de ruta webapp2 , aquí hay una respuesta más detallada en esta webapp2.Ruta con un hilo de pieza principal opcional .
Respuesta corta
Mis patrones de ruta funcionan para las siguientes URL.
- /
- /alimentar
- /alimentar/
- / 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''),
]
Espero eso ayude :-)
Para evitar la creación de URL duplicadas: s en la misma página, debe usar un RedirectRoute con strict_slash establecido en True para redirigir automáticamente / feed / to / feed, como esto:
from webapp2_extras.routes import RedirectRoute
route = RedirectRoute(''/feed'', handler=feed, strict_slash=True)
Lea más en http://webapp2.readthedocs.io/en/latest/api/webapp2_extras/routes.html
Se me ocurrió una especie de manera hacky. Defino la siguiente clase:
class UrlConf(object):
def __init__(self, *args, **kwargs):
self.confs = []
for arg in args:
if isinstance(arg, webapp2.Route):
slash_route = webapp2.Route(arg.template + ''/'', arg.handler)
self.confs += [arg, slash_route]
def __iter__(self):
for route in self.confs:
yield route
Luego configuro mis rutas como las siguientes:
MIRROR_URLS = list(UrlConf(
Route(''/path/to/stuff'', handler=StuffHandler, name=''stuff.page''),
Route(''/path/to/more/stuff'', handler= MoreStuffHandler, name=''more.stuff.page'')
))
Si elige ir a esta ruta, obviamente puede mejorarla para ser más flexible con otros tipos de objetos BaseRoute.
Si no desea utilizar redirecciones (y probablemente no lo haga), puede anular Route.match()
:
from webapp2 import Route, _get_route_variables
import urllib
from webob import exc
class SloppyRoute(Route):
"""
A route with optional trailing slash.
"""
def __init__(self, *args, **kwargs):
super(SloppyRoute, self).__init__(*args, **kwargs)
def match(self, request):
path = urllib.unquote(request.path)
match = self.regex.match(path)
try:
if not match and not path.endswith(''/''):
match = self.regex.match(path + ''/'')
except:
pass
if not match or self.schemes and request.scheme not in self.schemes:
return None
if self.methods and request.method not in self.methods:
# This will be caught by the router, so routes with different
# methods can be tried.
raise exc.HTTPMethodNotAllowed()
args, kwargs = _get_route_variables(match, self.defaults.copy())
return self, args, kwargs
webapp2.Route
plantilla webapp2.Route
no es una expresión regular y su valor se escapa con re.escape
. Puede usar reglas de estilo antiguo que proporcionan plantillas de expresiones regulares:
webapp2.SimpleRoute(''^/feed/?$'', handler = feed)