Flask上下文处理器 我们博客的设计是全站顶部菜单为通用菜单,调用的数据为文章的分类,那么如何将文章分类数据传递到每个页面的上下文呢? 为了将新变量自动注入模板的上下文中,Flask中存在上下文处理器contextprocessor。上下文处理器在呈现模板之前运行,并且能够将新值注入模板上下文。上下文处理器是返回字典的函数。然后,对于应用程序中的所有模板,此字典的键和值将与模板上下文合并: 用法如下所示,这只是一个例子:app。contextprocessordefinjectuser():returndict(userg。user) 上面的上下文处理器是一个名为user的变量在模板中可用,其值为g。user。这个例子不是很有趣,因为g无论如何都可以在模板中使用,但它给出了它是如何工作的。 变量不限于值;上下文处理器还可以使函数可用于模板(因为Python允许传递函数):app。contextprocessordefutilityprocessor():defformatprice(amount,currency):returnf{amount:。2f}{currency}returndict(formatpriceformatprice) 上面的上下文处理器使formatprice函数可用于所有模板:{{formatprice(0。33)}} 您还可以将formatprice构建为模板筛选器,但这演示了如何在上下文处理器中传递函数。实现全站导航功能 知道了上下文处理器的用法,实现这个功能就非常简单了! 在RealProject目录的init。py中插入如下一个上下文回调函数definjectcategory():上下文处理器回调函数contextprocessor上下文处理器在呈现模板之前运行,并且能够将新值注入模板上下文。上下文处理器是返回字典的函数。然后,对于应用程序中的所有模板,此字典的键和值将与模板上下文合并:fromapp。blog。modelsimportCategorycategorysCategory。query。limit(6)。all()returndict(categoryscategorys) 这个函数通过limit()方法查询出前6个数据,并通过一个字典返回,之后我们还需要将该回调函数注册到app的工厂函数当中!defcreateapp(testconfigNone):appFlask(name,instancerelativeconfigTrue)省略部分代码全局上下文app。contextprocessor(injectcategory)returnapp 在appblogtemplatesbase。html中循环查出我们返回的数据即可!导航{blocknavbar}templatebnavbarspacedshadowtemplatebrandbnavbaritemimgsrca2020imgdataimg。jpgdatasrcimg02。bs178。combf4hbcda1114040a9c34。jpgaltFlaskBlogbnavbaritemtemplatetemplatestartbnavbaritemhref{ifrequest。path}active{endif}首页bnavbaritem!查询菜单数据{forcateincategorys}bnavbaritemhref{{cate。name}}bnavbaritem{endfor}template!。。。省略部分代码bnavbartemplate{endblocknavbar}!导航end实现首页视图数据 在appblogviews。py文件中的index首页视图函数中实现defindex():首页视图pagerequest。args。get(page,1,typeint)paginationPost。query。orderby(Post。adddate)。paginate(page,perpage9,erroroutFalse)postlistpagination。itemsimportrandomimgs〔图一url,图二url,图三url〕forpostinpostlist:post。imgrandom。sample(imgs,1)〔0〕post。imgrandom。choice(imgs)returnrendertemplate(index。html,postspostlist,paginationpagination) 这个视图函数中的查询逻辑在实现文章管理的时候已经实现过,这里唯一不同的区别就是我给这个返回数据新增了一个img的属性,因为在数据库我们没有设计文章形象图字段,我们用这种方式弥补,在imgs的列表中预设一些图片的url地址,之后随机抽取一个赋值给img属性,这样在模板中直接调用这个img属性就会获取到图片的url! 在appblogtemplatesbase。html中替换相关循环数据{forpostinposts}figureclassimageis4by5imgsrca2020imgdataimg。jpgdatasrcimg02。bs178。combf4h5a72bd41e83d04f1。jpgaltPlaceholderimagefigurepclasstitleis4{{post。title}}pclasshastextgreysubtitleissize6{{post。desc}}timeclasshastextgreydatetime{{post。adddate}}{{post。adddate}}time{endfor}最终效果: