context_processor 上下文处理器

博客里面有三个地方用到了标签云:主页面,分类页面,博客详情页面,于是有了下面一段代码

# 主页面
@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 会不会太难看了一些,完全不优雅了嘛,有没有好的办法呢? 答案自然是有的,接下来就到我们的重点了。

context_processor 闪亮登场

跟我们之前的说到的钩子函数一样,它也有一个兄弟--app_context_processor,区别很简单,后者是针对蓝图的。让我们看一下它的官方定义:

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 了,它可以将我们的定义变量在所有模板中可见。

如何使用呢?

1. 如上述代码那样, context_processor 作为一个装饰器修饰一个函数

2. 函数的返回结果必须是 dict, 然后其 key 将会作为变量在所有模板中可见

当你的很多视图函数中需要回传一个相同的变量的时候,这个时候就可以考虑使用 context_processor 了

context_processor 上下文处理器的更多相关文章

  1. django上下文处理器

    上下文处理器(context processors)上下文处理器是可以返回一些数据,在全局模板中都可以使用.比如登录后的用户信息,在很多页面中都需要使用,那么我们可以放在上下文处理器中,就没有必要在每 ...

  2. django上下文处理器的基本使用

    1.定义一个方法 2.在django里面的settings.py里面修改配置文件 3.最后在模板里面调用 操做步骤如下: 这是在settings.py里面配置的文件   在模板里面调用上下文处理器

  3. Django 上下文处理器

    Django 上下文处理器 模板要在上下文中渲染. 上下文是django.template.Context的实例.django.template.RequestContext是Django提供的一个子 ...

  4. Django - 请求与响应、表单、中间件、上下文处理器

    请求与响应篇 一.HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象.视图函数的第一个参数(request)是HttpRequest对象在djang ...

  5. Django 12 中间件、上下文处理器和admin后台

    Django 12 中间件.上下文处理器和admin后台 一.中间件 #Django中间件 (Middleware) # 一个轻量级.底层的“插件”系统,可以介入Django的请求和响应处理过程,修改 ...

  6. Django框架基础知识12-中间件及上下文处理器

    Django中间件(Middleware) 是一个轻量级.底层的“插件”系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出. django 中的中间件(middleware) ...

  7. Django——12 中间件 上下文处理器 admin后台

    Django 中间件 中间件介绍 中间件的第一个例子 中间件的第二个例子 上下文处理器 admin后台管理   中间件 Django中间件(Middleware)是一个轻量级.底层的“插件”系统,可以 ...

  8. 141.内置上下文处理器debug、request、auth、messages、media、static、csrf

    上下文处理器 上下文处理器可以返回一些数据,在全局模板中都可以使用,比如登录后的用户数据,在很多页面中都需要使用,那么我们就可以方在上下文处理器中,就没有必要在每个视图中返回这个对象了. 在setti ...

  9. flask模板

    做为python web开发领域的一员,flask跟Django在很多地方用法以都是相似的,比如flask的模板 模板就是服务器端的页面,在模板中可以使用服务端的语法进行输出控制 1.模板的工作原理 ...

随机推荐

  1. 查看mysql的bin-log日志

    1.查看有哪些binlog show binary logs; show master logs; 2.如何查看log_bin中的内容 show binlog events; 查看第一个binlog的 ...

  2. 更优雅地关闭资源 - try-with-resource及其异常抑制--转载

    原文地址:https://www.cnblogs.com/itZhy/p/7636615.html 一.背景 我们知道,在Java编程过程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必 ...

  3. input 设置 display:none后 jquery无法给input赋值

    问题出现场景:为什么要用 jquery给input赋值,为什么input带有display:none 在做字典查询的时候,查询参数有字典类型的treeSelect 下拉框,treeSelect渲染后, ...

  4. Java集合--Vector

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308833.html 第1部分 Vector介绍 Vector简介 Vector 是矢量队列,它是JDK ...

  5. 纯css实现树形结构

    纯css实现属性结构 **css实现属性结构的思路是利用伪类实现树形结构连接线,如果想实现点击展开和收 缩以及复选框效果还得配合js来实现.其实展开和收缩就是一个点击元素其子元素隐藏 和显示的切换.* ...

  6. selenium怎样避免被服务器检测

    selenium是用来完成浏览器自动化相关的操作.可以通过代码的形式制定一些基于浏览器自动化的相关操作(行为动作),当代码执行后,浏览器就会自动触发相关的事件.但这并不能避免服务器的检测.当在浏览器中 ...

  7. Jquery select 三级联动 (需要JSON数据)

    Scripts/Category.js //Jquery三级类别联动 $(function () { BindCategory(); }) function BindCategory() { var ...

  8. 015_使用 expect 工具自动交互密码远程其他主机安装 httpd 软件

    #!/bin/bash#删除~/.ssh/known_hosts 后,ssh 远程任何主机都会询问是否确认要连接该主机rm -rf ~/.ssh/known_hostsexpect <<E ...

  9. windows日志分析工具-LogonTracer

    0x01 Windows应急日志常用的几个事件ID 4624:这个事件ID表示成功登陆的用户,用来筛选该系统的用户登陆成功情况. 4625:这个事件ID表示登陆失败的用户. 4768:这个事件ID表示 ...

  10. xgzc— math 专题训练(一)

    Lucas定理 当\(p\)是质数时,有\((^n_m)\equiv(^{n/p}_{m/p}) * (^{n\%p}_{m\%p}) \pmod{p}\) 狄利克雷卷积 定义:\((f*g)(n)= ...