jinja async africa python flask jinja2

python - async - jinja2 datetime



Obtener un parĂ¡metro de solicitud en Jinja2 (3)

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

http://foo.bar?a=1


Estoy un poco retrasado 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 que sea necesario 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 de forma predeterminada:

...

request 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 forma similar.


Tendrá que pasar esta información a sus plantillas de jinja2, ya que es solo un motor de plantillas, y no el marco 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 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 puede enviar este diccionario request_params a su plantilla de jinja.


Si estás usando webapp2 ...

Los parámetros de consulta se pueden recuperar 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 quieres la cadena de consulta no analizada simplemente llama:

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

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

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

Actualizar:

Tengo una manera 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 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 ''contexto''. 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, puede imprimir el valor de ''a'' usando:

{{ a }}

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

Cómo se estructuran sus manejadores depende 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 más 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.