Flask上下文處理器
我們博客的設(shè)計(jì)是全站頂部菜單為通用菜單,調(diào)用的數(shù)據(jù)為文章的分類,那么如何將文章分類數(shù)據(jù)傳遞到每個(gè)頁(yè)面的上下文呢?
為了將新變量自動(dòng)注入模板的上下文中,F(xiàn)lask 中存在上下文處理器context_processor。上下文處理器在呈現(xiàn)模板之前運(yùn)行,并且能夠?qū)⑿轮底⑷肽0迳舷挛摹I舷挛奶幚砥魇欠祷?span id="vcbw4wz" class="wpcom_tag_link">字典的函數(shù)。然后,對(duì)于應(yīng)用程序中的所有模板,此字典的鍵和值將與模板上下文合并:
用法如下所示,這只是一個(gè)例子:
@app.context_processordef inject_user(): return dict(user=g.user)
上面的上下文處理器是一個(gè)名為 user 的變量在模板中可用,其值為 g.user。這個(gè)例子不是很有趣,因?yàn)間無論如何都可以在模板中使用,但它給出了它是如何工作的。
變量不限于值;上下文處理器還可以使函數(shù)可用于模板(因?yàn)镻ython允許傳遞函數(shù)):
@app.context_processordef utility_processor(): def format_price(amount, currency=” “): return f”{amount:.2f}{currency}” return dict(format_price=format_price)
上面的上下文處理器使format_price函數(shù)可用于所有模板:
{{ format_price(0.33) }}
您還可以將format_price構(gòu)建為模板篩選器,但這演示了如何在上下文處理器中傳遞函數(shù)。
實(shí)現(xiàn)全站導(dǎo)航功能
知道了上下文處理器的用法,實(shí)現(xiàn)這個(gè)功能就非常簡(jiǎn)單了!
在RealProject目錄的__init__.py中插入如下一個(gè)上下文回調(diào)函數(shù)
def inject_category(): # 上下文處理器回調(diào)函數(shù) “”” context_processor上下文處理器在呈現(xiàn)模板之前運(yùn)行,并且能夠?qū)⑿轮底⑷肽0迳舷挛?。上下文處理器是返回字典的函?shù)。 然后,對(duì)于應(yīng)用程序中的所有模板,此字典的鍵和值將與模板上下文合并: “”” from app.blog.models import Category categorys = Category.query.limit(6).all() return dict(categorys=categorys)
這個(gè)函數(shù)通過limit()方法查詢出前6個(gè)數(shù)據(jù),并通過一個(gè)字典返回,之后我們還需要將該回調(diào)函數(shù)注冊(cè)到app的工廠函數(shù)當(dāng)中!
def create_app(test_config=None): app = Flask(__name__, instance_relative_config=True) # 省略部分代碼 # 全局上下文 app.context_processor(inject_category) return app
在app/blog/templates/base.html中循環(huán)查出我們返回的數(shù)據(jù)即可
{% block navbar %} 首頁(yè) {% for cate in categorys %} {{ cate.name }} {% endfor %} {% endblock navbar %}
實(shí)現(xiàn)首頁(yè)視圖數(shù)據(jù)
在app/blog/views.py文件中的index首頁(yè)視圖函數(shù)中實(shí)現(xiàn)
def index(): “””首頁(yè)視圖 “”” page = request.args.get(‘page’, 1, type=int) pagination = Post.query.order_by(-Post.add_date).paginate(page, per_page=9, error_out=False) post_list = pagination.items import random imgs = [‘圖一url’, ‘圖二url’, ‘圖三url’] for post in post_list: post.img = random.sample(imgs, 1)[0] # post.img = random.choice(imgs) return render_template(‘index.html’, posts=post_list, pagination=pagination)
這個(gè)視圖函數(shù)中的查詢邏輯在實(shí)現(xiàn)文章管理的時(shí)候已經(jīng)實(shí)現(xiàn)過,這里唯一不同的區(qū)別就是我給這個(gè)返回?cái)?shù)據(jù)新增了一個(gè)img的屬性,因?yàn)樵跀?shù)據(jù)庫(kù)我們沒有設(shè)計(jì)文章形象圖字段,我們用這種方式彌補(bǔ),在imgs的列表中預(yù)設(shè)一些圖片的url地址,之后隨機(jī)抽取一個(gè)賦值給img屬性,這樣在模板中直接調(diào)用這個(gè)img屬性就會(huì)獲取到圖片的url!
在app/blog/templates/base.html中替換相關(guān)循環(huán)數(shù)據(jù)
{% for post in posts %}
{{ post.title }}
{{ post.desc }}
{{ post.add_date }} {% endfor %}