2012-03-10 32 views
24

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

http://foo.bar?a=1 
+1

¿Qué marco está utilizando con Jinja2? –

+0

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

Respuesta

43

Llego un poco tarde con esta respuesta, pero las otras soluciones realmente no dan cuenta de su 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 realmente pone a su disposición algunas variables globales en todas las plantillas de Jinja2 sin necesidad de pasarlas a la plantilla explícitamente.

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

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

...

solicitud La solicitud objeto actual (flask.request)

...

Así, por ejemplo, para mostrar el parámetro de la petición 'a' en la plantilla:

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

El enlace de documentación también se enumeran las otras variables globales se puede acceder de una manera similar.

0

Usted tendrá que pasar esta información a sus plantillas Jinja2, ya que es sólo un motor de plantillas, y no el framework de desarrollo web.

La parte de "generación de vista" de su marco de trabajo 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 lo hace, entonces puede pasar esto a su plantilla.

Incluso si la información del encabezado que recibe no incluye los parámetros de solicitud, siempre incluirá la url. Una vez que tenga la URL en la vista de código de función, se 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 usted puede enviar este diccionario request_params a la plantilla de Jinja.

+0

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

+1

Dependiendo de su marco web, podría ser compatible con un sistema 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 anexan automáticamente a la plantilla de jinja. Incluso si no existe tal mecanismo, podría hacer algo similar con decoradores. La mayoría de las aplicaciones web admiten middleware, ya que es un concepto central en WSGI. –

+1

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

3

Si está utilizando webapp2 ...

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

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

Para aplicar la 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 lo que desea la cadena de consulta sin interpretar solo llaman:

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

vez que haya recogido las variables sólo les pasan al método jinja2.render_template() igual que lo haría con cualquier otra cosa.

Realmente no es mucho más fácil que eso.

Actualización:

Tengo una manera bastante único para gestionar parámetros pero voy a tratar de explicar la versión simple.

Suponiendo que la siguiente cadena de consulta

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

Así es como me gustaría escribir el manejador 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) 

Por lo tanto, la aplicación que uso es un poco diferente. También apilo en un parámetro _defaults que se pasa a través del enrutador, y un parámetro _meta (es decir, title/description/url) que se crea haciendo una búsqueda uri en una estructura de URL 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 'context'. Ahí es donde se acumulan 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 se pasa en una matriz de valores como uno de los parámetros también se puede enumerar a través de ellos y llamar a propiedades específicas directamente utilizando puntos notación.

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

+1

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

+0

@ShankarCabus No, pasas los parámetros a la plantilla de python. He actualizado mi respuesta para ilustrar cómo. –