回答
我對這個答案有點晚了,但其他解決方案並沒有真正考慮到你使用Flask。
事實上,你在Jinja2上使用Flask會讓你的情況與其他框架有所不同。 Flask實際上使所有Jinja2模板中的某些全局變量可用,而不需要您明確地將它們傳遞給模板。
要在http://flask.pocoo.org/docs/templating/#standard-context引用文檔瓶的一部分:
以下全局變量是內Jinja2的模板默認情況下可用:
...
要求 當前請求對象(flask.request)
...
因此,例如,以顯示請求參數「一個」模板:
{{ request.args.get('a') }}
的文檔鏈接還列出了可以以類似的方式訪問其他全局變量。
您需要將這些信息傳遞給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
字典您神社模板。
但許多控制器使用相同的模板。所以我需要在所有控制器上執行此操作,但只能在模板中執行一次時=/ – 2012-03-10 17:38:55
根據您的Web框架,它可能支持包裝視圖或其他圖層的「中間件」類型系統。這意味着在你的視圖函數之前,請求參數是由你的自定義中間件提取的,並且在你的視圖函數之後,這些請求參數會自動附加到jinja模板。即使沒有這樣的機制,你可以輕鬆地做一些類似的裝飾。大多數Web應用程序都支持中間件,因爲它是WSGI中的一箇中心概念。 – 2012-03-10 18:54:20
但如何檢索模板(.html)這個參數?有可能的? – 2012-09-01 03:21:14
如果您使用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,以便子類可以訪問它。在代碼中看起來相當複雜,但一旦所有東西都連接起來,幾乎毫不費力地添加額外的頁面/路由。
但如何檢索模板(.html)中的這個參數?有可能的? – 2012-09-14 17:07:03
@ShankarCabus不,您將參數從python傳遞到模板中。我已經更新了我的答案以說明如何。 – 2012-10-30 21:48:31
- 1. 在jinja2中獲取請求URI?
- 2. 在django syndication中獲取請求參數?
- 3. 在Django中獲取PATCH請求參數
- 4. 在Selenium中獲取請求參數
- 5. 如何在POST請求中獲取GET和POST請求參數?
- 6. 從soap請求中獲取參數
- 7. 獲取請求中的參數
- 8. 獲取請求查詢參數計數
- 9. 從Restlet請求獲取HTTP GET參數
- 10. $ httpProvider請求攔截器 - 獲取參數
- 11. 使用Play Framework獲取請求參數?
- 12. 獲取GET請求參數到@ViewScoped bean
- 13. 如何從urls.py獲取請求參數?
- 14. 解析HTTP獲取請求的參數
- 15. HttpClient-添加參數獲取請求
- 16. 使用$ {param}獲取請求參數
- 17. 播放獲取json請求參數
- 18. HttpServletRequest無法獲取xhr請求參數
- 19. 在Python中讀取請求參數
- 20. jQuery - AJAX - 在成功函數中獲取請求的參數
- 21. 如何獲取從請求字符串參數AJAX POST請求
- 22. 從獲取請求中獲取數據?
- 23. 如何在Sinatra中獲取xml post請求參數?
- 24. 在HTTP中使用ActivatedRoute參數獲取請求
- 25. 燒瓶 - 在Google App Engine中獲取請求參數?
- 26. 在Customiz地圖中獲取請求參數地圖?
- 27. 如何在Json中傳遞參數獲取請求
- 28. 如何在php中獲取ajax請求的參數
- 29. 在http appengine中獲取http請求參數
- 30. 在node.js中獲取動態請求參數
您使用Jinja2的框架是什麼? – 2012-03-10 15:31:24
燒瓶。但我想在模板(.html)中檢索這個參數,而不是在.py文件中。 @DevinM – 2012-09-01 03:20:18