Obtener un parámetro de solicitud en Jinja2

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

http://foo.bar?a=1

preguntado el 10 de marzo de 12 a las 15:03

¿Qué marco estás usando con Jinja2? -

Matraz. Pero quiero recuperar este parámetro en la plantilla (.html) no en el archivo .py. @DevinM-

4 Respuestas

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

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

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 en las plantillas de Jinja2 de forma predeterminada:

...

request El objeto de solicitud actual (flask.request)

...

Entonces, 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 manera similar.

Respondido el 01 de junio de 13 a las 19:06

gracias. Entonces, ¿cómo {{ request.args.get('a') }} para . porque mi 'a' es una lista de python y el resultado de <textarea> es desordenado e incompleto. por favor como hacer eso? - Negrita Ganbaatar

Si está utilizando webapp2...

Los parámetros de consulta se pueden obtener 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 la cadena de consulta sin analizar, simplemente llame a:

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

Una vez que haya recopilado 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 los parámetros, pero intentaré 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 apilé 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 haciendo una búsqueda de uri en una estructura de URL personalizada.

En mi controlador 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 apila 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 de '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.

La forma en que se estructuran sus controladores 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, así que no tengo que repetir mucho. Es un poco difícil de explicar con más detalle sin pegar todo mi controlador handlers.py, pero esta es la esencia de mi controlador base del que heredan el resto de mis controladores. La única diferencia notable es que defino context 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.

Respondido 30 Oct 12, 22:10

Pero, ¿cómo recuperar este parámetro en la plantilla (.html)? ¿Es posible? - Shankar Cabú

@ShankarCabus No, pasas los parámetros a la plantilla desde python. He actualizado mi respuesta para ilustrar cómo. - Evan Solla

Deberá 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 vista" de su marco web que se ocupa de las solicitudes generalmente recibirá información de encabezado de solicitud HTTP o estructura de datos. esto a menudo incluye los parámetros de solicitud. Si es así, simplemente puede pasar esto a su plantilla.

Incluso si la información del encabezado que obtiene no incluye los parámetros de la 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'}

Entonces puedes enviar esto request_params diccionario a su plantilla jinja.

respondido 10 mar '12, 16:03

Pero muchos controladores usan la misma plantilla. Así que necesito hacer esto en todos los controladores, cuando podría hacerlo solo una vez en la plantilla =/ - Shankar Cabú

Dependiendo de su marco web, podría admitir un sistema de tipo "middleware" que envuelve sus vistas u otras capas. Esto significaría que antes de su función de vista, los parámetros de solicitud son extraídos por su middleware personalizado, y después de su función de vista, estos parámetros de solicitud se agregan automáticamente a la plantilla jinja. Incluso si no existe tal mecanismo, fácilmente podría hacer algo similar con los decoradores. La mayoría de las aplicaciones web admiten middleware, ya que es un concepto central en WSGI. - Preet Kukreti

Pero, ¿cómo recuperar este parámetro en la plantilla (.html)? ¿Es posible? - Shankar Cabú

En su plantilla Jinja2 si lo define como a continuación:::

<h2><a href="{{url_for('single_thing', id='2', pid='34')}}">{{some_value}}</a> </h2>

Su URI será:::

http://127.0.0.1:5000/single_thing?pid=34&id=2

Respondido 29 Oct 19, 14:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.