博客裏面有三個地方用到了標籤雲:主頁面,分類頁面,博客詳情頁面,因而有了下面一段代碼html
# 主頁面 @main.route("/") def index(): tags = Tag.query.all() # ...省略部分代碼 return render_html("index.html", tags=tags,) # 分類頁面 @main.route("tag/<int:id>") def tags(id): tags = Tag.query.all() # ...省略部分代碼 return render_html("tags.html", tags=tags,) # 博客詳情頁面 @main.route("post/<int:id>") def post(id): tags = Tag.query.all() # ...省略部分代碼 return render_html("post.html", tags=tags,post=post)
好像問題解決了?全部頁面都能顯示出來標籤雲了? 可是這三個頁面都回傳 tags 會不會太難看了一些,徹底不優雅了嘛,有沒有好的辦法呢? 答案天然是有的,接下來就到咱們的重點了。python
跟咱們以前的說到的鉤子函數同樣,它也有一個兄弟--app_context_processor,區別很簡單,後者是針對藍圖的。讓咱們看一下它的官方定義:app
Registers a template context processor function.
翻譯過來很簡單: 註冊模板上下文處理器功能。 這個真能解決咱們的問題嗎?彆着急讓咱們試一下,把以前的代碼改造一下。函數
@main.app_context_processor def peach_blog_menu(): tags = Tag.query.all() return dict(tags=tags) @main.route("/") def index(): # ...省略部分代碼 return render_html("index.html") # 分類頁面 @main.route("tag/<int:id>") def tags(id): # ...省略部分代碼 return render_html("tags.html") # 博客詳情頁面 @main.route("post/<int:id>") def post(id): tags = Tag.query.all() # ...省略部分代碼 return render_html("post.html")
是否是發現什麼消失了? tags 好像從以前的幾個函數中消失了,沒有回傳到前臺,能訪問到嗎?天然是能夠的。緣由天然是 context_processor 了,它能夠將咱們的定義變量在全部模板中可見。post
如何使用呢?spa
1. 如上述代碼那樣, context_processor 做爲一個裝飾器修飾一個函數翻譯
2. 函數的返回結果必須是 dict, 而後其 key 將會做爲變量在全部模板中可見code
當你的不少視圖函數中須要回傳一個相同的變量的時候,這個時候就能夠考慮使用 context_processor 了htm