Obteniendo un parámetro de solicitud en Jinja2

¿Cómo puedo recuperar un parámetro de solicitud en la plantilla de Jinja2?

 http://foo.bar?a=1 

Estoy un poco tarde con esta respuesta, pero las otras soluciones realmente no tienen en cuenta el uso de Flask.

El hecho de que esté utilizando Flask con Jinja2 hace que su situación sea un poco diferente a la de otros marcos. En realidad, Flask pone a su disposición algunas variables globales en todas las plantillas de Jinja2 sin necesidad de que las pase a la plantilla explícitamente.

Para citar una parte de la documentación de Flask en http://flask.pocoo.org/docs/templating/#standard-context :

Las siguientes variables globales están disponibles dentro de las plantillas de Jinja2 por defecto:

solicitud El objeto de solicitud actual (flask.request)

Por ejemplo, para mostrar el parámetro de solicitud ‘a’ en la plantilla:

 {{ request.args.get('a') }} 

El enlace de documentación también enumera las otras variables globales a las que puede acceder de una manera similar.

Si estás utilizando webapp2 …

Los parámetros de consulta se pueden buscar fácilmente si usa webapp2.request como un diccionario.

 webapp2.request.get('[parameter]', '[optionalDefaultValue]') 

Para aplicar su muestra (http://foo.bar?a=1&b=2&c=true):

 a = webapp2.request.get('a') # a = 1 b = webapp2.request.get('b') # b = 2 c = webapp2.request.get('c') # c = true, may need further parsing to make it bool 

Si solo desea que la cadena de consulta sin analizar simplemente llame:

 qstring = webapp2.request.query_string # qstring = '?a=1&b=2&c=true 

Una vez que haya recostackdo sus variables, simplemente páselas al método jinja2.render_template () de la misma manera que lo haría con cualquier otra cosa.

Realmente no hay nada más fácil que eso.

Actualizar:

Tengo una forma bastante única de administrar parámetros, pero trataré de explicar la versión simple.

Suponiendo la siguiente cadena de consulta

 http://foo.bar?a=1&b=2&c=true 

Así es como escribiría el controlador GET:

 class BaseHandler(webapp2.RequestHandler): def jinja2(self): return jinja2.get_jinja2(app=self.app) def render_template(self, template, **context): self.response.write(self.jinja2.render_template(template, **context)) def get(self, **params): context = {} context['a'] = webapp2.request.get('a') context['b'] = webapp2.request.get('b') context['c'] = webapp2.request.get('c') self.render_template([template], **context) 

Entonces, la implementación que uso es un poco diferente. También apilo un parámetro _defaults que se pasa a través del enrutador, y un parámetro _meta (es decir, título / descripción / url) que se crea al realizar una búsqueda de uri en una estructura de urls personalizada.

En mi controlador de base, configuro jinja y envuelvo la instancia en un método que es más fácil de llamar (es decir, render_template). No se me ocurrió esta idea, creo que la obtuve de los documentos de webapp2 pero estoy divagando.

La parte importante es el parámetro ‘contexto’. Ahí es donde se astackn todos los datos que desea enviar a la plantilla. Ahora, cualquier valor que esté disponible en ese objeto ahora estará disponible en la plantilla.

Por ejemplo, podría imprimir el valor para ‘a’ usando:

 {{ a }} 

Si pasa una matriz de valores como uno de los parámetros, también puede enumerarlos y llamar a propiedades específicas directamente usando la notación de puntos.

Cómo se estructuran sus manejadores depende completamente de usted. A diferencia de muchos marcos, GAE proporciona mucha flexibilidad en este aspecto. La forma en que lo hago implica mucha herencia, por lo que no tengo que repetir mucho. Es un poco difícil de explicar con mejor detalle sin pegar todos mis manejadores.py, pero esta es la esencia de mi manejador base del que heredan todos los demás manejadores. La única diferencia notable es que defino el contexto como self.context para que las clases secundarias puedan acceder a él. Parece bastante complicado en el código, pero una vez que todo está conectado, es casi fácil agregar páginas / rutas adicionales.

Necesitará pasar esta información a sus plantillas jinja2, ya que es solo un motor de plantillas, y no el marco web.

La parte de “generación de vistas” de su marco web que trata con solicitudes generalmente se pasará parte de la información del encabezado de solicitud HTTP o la estructura de datos. Esto a menudo incluye los parámetros de solicitud. Si lo hace, entonces puede pasar esto a su plantilla.

Incluso si la información del encabezado que obtiene no incluye los parámetros de solicitud, siempre incluirá la url. Una vez que tenga la url en su código de función de vista, puede hacer algo como esto:

 url = "http://foo.bar?a=1&b=2&c=true" # actually get this from your http request header import urlparse split_result = urlparse.urlsplit(url) request_params = dict(urlparse.parse_qsl(split_result.query)) # request_params = {'a': '1', 'b': '2', 'c': 'true'} 

Luego puedes enviar este diccionario de request_params a tu plantilla jinja.