2012-03-10 109 views
24

如何在Jinja2模板中檢索請求參數a在Jinja2中獲取請求參數

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

您使用Jinja2的框架是什麼? – 2012-03-10 15:31:24

+0

燒瓶。但我想在模板(.html)中檢索這個參數,而不是在.py文件中。 @DevinM – 2012-09-01 03:20:18

回答

43

我對這個答案有點晚了,但其他解決方案並沒有真正考慮到你使用Flask。

事實上,你在Jinja2上使用Flask會讓你的情況與其他框架有所不同。 Flask實際上使所有Jinja2模板中的某些全局變量可用,而不需要您明確地將它們傳遞給模板。

要在http://flask.pocoo.org/docs/templating/#standard-context引用文檔瓶的一部分:

以下全局變量是內Jinja2的模板默認情況下可用:

...

要求 當前請求對象(flask.request)

...

因此,例如,以顯示請求參數「一個」模板:

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

的文檔鏈接還列出了可以以類似的方式訪問其他全局變量。

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字典您神社模板。

+0

但許多控制器使用相同的模板。所以我需要在所有控制器上執行此操作,但只能在模板中執行一次時=/ – 2012-03-10 17:38:55

+1

根據您的Web框架,它可能支持包裝視圖或其他圖層的「中間件」類型系統。這意味着在你的視圖函數之前,請求參數是由你的自定義中間件提取的,並且在你的視圖函數之後,這些請求參數會自動附加到jinja模板。即使沒有這樣的機制,你可以輕鬆地做一些類似的裝飾。大多數Web應用程序都支持中間件,因爲它是WSGI中的一箇中心概念。 – 2012-03-10 18:54:20

+1

但如何檢索模板(.html)這個參數?有可能的? – 2012-09-01 03:21:14

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文檔中得到它,但我離題了。

重要的部分是'上下文'參數。這就是您要將所有要發送到模板的數據堆疊起來的地方。現在,該對象中可用的任何值現在都將在模板中可用。

例如,你可以打印值「A」使用:

{{ a }} 

如果在值的陣列通過如也可以通過它們列舉的參數之一,並調用直接使用點的特定屬性符號。

您的處理程序的結構完全取決於您。與許多框架不同,GAE在這方面提供了很大的靈活性。我這樣做的方式涉及很多繼承,所以我不必重複太多。在沒有粘貼我的整個handlers.py的情況下更好地詳細解釋有點困難,但這是我的基本處理程序的要點,我的所有其他處理程序都從此繼承。唯一顯着的區別是我將context定義爲self.context,以便子類可以訪問它。在代碼中看起來相當複雜,但一旦所有東西都連接起來,幾乎毫不費力地添加額外的頁面/路由。

+1

但如何檢索模板(.html)中的這個參數?有可能的? – 2012-09-14 17:07:03

+0

@ShankarCabus不,您將參數從python傳遞到模板中。我已經更新了我的答案以說明如何。 – 2012-10-30 21:48:31