hacer graficos grafico graficas grafica error encimar dispersion diagrama crear como barras python google-app-engine webapp2

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.

  1. /
  2. /alimentar
  3. /alimentar/
  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''), ]

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)