web-dev-qa-db-ja.com

Jinja2でリクエストパラメーターを取得する

Jinja2テンプレートでリクエストパラメータaを取得するにはどうすればよいですか?

http://foo.bar?a=1
36
Shankar Cabus

私はこの答えに少し遅れていますが、他の解決策はFlaskの使用を実際には考慮していません。

Jinja2でFlaskを使用しているという事実により、他のフレームワークとは少し状況が異なります。Flaskは、すべてのJinja2テンプレートに明示的に渡す必要のないテンプレート。

Flask http://flask.pocoo.org/docs/templating/#standard-context のドキュメントの一部を引用するには:

次のグローバル変数は、デフォルトでJinja2テンプレート内で使用できます。

...

request現在のリクエストオブジェクト(flask.request)

...

たとえば、テンプレートにリクエストパラメータ「a」を表示するには:

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

ドキュメントリンクには、同様の方法でアクセスできる他のグローバル変数もリストされています。

61
Kalle

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パラメーターと、カスタムurls構造でuriルックアップを行うことで作成される_meta(つまり、title/description/url)パラメーターにもスタックします。

基本ハンドラーで、jinjaをセットアップし、呼び出しやすいメソッド(render_template)でインスタンスをラップします。私はこの考えを思いつきませんでした。webapp2のドキュメントから得たと思いますが、脱線します。

重要な部分は「コンテキスト」パラメーターです。ここで、テンプレートに送信するすべてのデータをスタックします。これで、そのオブジェクトで使用可能なすべての値がテンプレートで使用可能になります。

たとえば、次を使用して「a」の値を出力できます。

{{ a }}

パラメータの1つとして値の配列を渡す場合、それらを列挙し、ドット表記を使用して特定のプロパティを直接呼び出すこともできます。

ハンドラーの構造は完全にあなた次第です。多くのフレームワークとは異なり、GAEはこの面で多くの柔軟性を提供します。私がそれを行う方法は、多くの継承を伴うため、多くを繰り返す必要はありません。 handlers.py全体を貼り付けずに詳細に説明するのは少し難しいですが、これは私のすべてのハンドラーが継承するベースハンドラーの要点です。唯一の顕著な違いは、子クラスがアクセスできるようにコンテキストをself.contextとして定義していることです。コードではかなり複雑に思えますが、すべてが接続されると、追加のページ/ルートを追加するのはほとんど簡単です。

3
Evan Plaice

この情報は、Webフレームワークではなく単なるテンプレートエンジンであるため、jinja2テンプレートに渡す必要があります。

要求を処理するWebフレームワークの「ビュー生成」部分には、通常、HTTP要求ヘッダー情報またはデータ構造が渡されます。多くの場合、これには要求パラメーターが含まれます。存在する場合は、これをテンプレートに渡すだけです。

取得したヘッダー情報にリクエストパラメータが含まれていなくても、常にURLが含まれます。ビュー関数コードに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テンプレートの辞書。

0
Preet Kukreti