如何在Jinja2模板中检索请求参数a
?
http://foo.bar?a=1
答案 0 :(得分:57)
我对这个答案有点迟了,但其他解决方案并没有真正解释你对Flask的使用。
您使用Flask与Jinja2的事实使您的情况与其他框架有所不同。 Flask实际上在所有Jinja2模板中都可以使用一些全局变量,而无需您明确地将它们传递给模板。
引用http://flask.pocoo.org/docs/templating/#standard-context上的部分Flask文档:
默认情况下,Jinja2模板中提供以下全局变量:
...
请求 当前请求对象(flask.request)
...
例如,在模板中显示请求参数“a”:
{{ request.args.get('a') }}
文档链接还列出了您可以以类似方式访问的其他全局变量。
答案 1 :(得分:3)
如果您使用的是webapp2 ...
如果您像字典一样使用webapp2.request,则可以轻松获取查询参数。
webapp2.request.get('[parameter]', '[optionalDefaultValue]')
申请样本(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
如果您只是想要解析未解析的查询字符串:
qstring = webapp2.request.query_string
# qstring = '?a=1&b=2&c=true
收集完变量后,只需将它们传递给jinja2.render_template()方法,就像其他任何方法一样。
这真的不容易。
<强>更新强>
我有一种非常独特的方法来管理参数,但我会尝试解释简单版本。
假设以下查询字符串
http://foo.bar?a=1&b=2&c=true
以下是我编写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)
所以,我使用的实现有点不同。我还堆叠了一个通过路由器传入的_defaults参数,以及一个通过在自定义URL结构上进行uri查找而创建的_meta(即title / description / url)参数。
在我的基本处理程序中,我设置了jinja并将实例包装在一个更容易调用的方法中(即render_template)。我没有提出这个想法,我想我是从webapp2文档中得到的,但我离题了。
重要的部分是'context'参数。这就是您要将所有数据堆叠到模板中的位置。现在,该对象中可用的任何值现在都可以在模板中使用。
例如,你可以使用:
打印'a'的值{{ a }}
如果您传入一个值数组作为其中一个参数,您也可以通过它们进行枚举,并使用点表示法直接调用特定属性。
您的处理程序的结构完全取决于您。与许多框架不同,GAE在这方面提供了很大的灵活性。我这样做的方式涉及很多继承,所以我不必重复太多。如果不粘贴我的整个handlers.py就更难以更详细地解释,但这是我的基本处理程序的要点,其余的处理程序都继承自。唯一值得注意的区别是我将context定义为self.context,因此子类可以访问它。在代码中看起来相当复杂,但是一旦所有内容都连接起来,添加额外的页面/路径几乎都不费吹灰之力。
答案 2 :(得分:0)
您需要将此信息传递给jinja2模板,因为它只是一个模板引擎,而不是Web框架。
处理请求的Web框架的“视图生成”部分通常会传递一些HTTP请求标头信息或数据结构。这通常包括请求参数。如果是,那么您可以将其传递给您的模板。
即使您获得的标题信息不包含请求参数,它也将始终包含网址。一旦在视图功能代码中有了url,就可以执行以下操作:
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'}
然后您可以将此request_params
字典发送到您的jinja模板。
答案 3 :(得分:0)
在Jinja2模板中,如果您按如下方式定义它:::
<h2><a href="{{url_for('single_thing', id='2', pid='34')}}">{{some_value}}</a> </h2>
您的URI为:::
http://127.0.0.1:5000/single_thing?pid=34&id=2