当前位置 博文首页 > 孤寒者的博客:40.上下文处理器&&如何自定义上下文处理

    孤寒者的博客:40.上下文处理器&&如何自定义上下文处理

    作者:[db:作者] 时间:2021-09-11 10:39

    引言——
    ??在前面我们知道在模板中想要使用的变量是从视图函数中的context这个上下文的参数中传递进来的,每个视图函数需要什么参数就传什么参数。
    ??但是,假设我们现在有这么多问题,我需要给多个不同的模板传递几个相同的变量使用,难道我要给每个模板对应的视图函数都加context,使用其传递嘛?
    ??确实可以,但是岂不麻烦?这里就要请出我们伟大的**上下文处理器!**我们使用它,可以一次性将指定变量传给所有模板,供每个模板使用!!!

    上下文处理器(Context Processor)

    1.上下文处理器是个啥? && 它是干啥的?

    • 上下文处理器也称作上下文渲染器。但我更倾向于称其为处理,毕竟processor的翻译是“处理。”但是称为上下文渲染器也有道理,渲染更接近于使用场景。

    • Django中的Context Processor主要是应用于模板,完成页面的绘制的一些处理,也就是所说的页面渲染。

    • 上下文,从计算机编程的角度来说——就是指环境。
      也就是说,同一段处理程序对于不同的环境,反馈出不同的处理结果。

    • 借用网上的一个例子:用户访问站点的时候,站点的所有页面上都要能够显示这个用户自己的IP地址。
      ??这样的功能,我们需要从请求(request)中获取到访问用户的IP地址,然后呈现到页面中。也许大家能够想到,我们可以在每个页面对应的视图函数中进行这个处理,但是未免太过麻烦。最好的方式是将处理过程定义一次,就能够在每个页面中使用。
      ??此时,我们可以通过自定义一个上下文处理器帮助我们完成。
      面对不同来源的用户通过同一个处理器完成页面上不同IP地址的渲染。

    上下文处理器就是创建模板变量,但是与使用context传参有所不同。使用上下文处理器可以给每一个模板都提供相同的变量(即一次性将制定变量传给所有模板,让每个模板都可以使用)

    2.来看一看Django中的上下文配置项

    在settings.py中,包含了当前使用的上下文处理器。他的作用是可以给每一个模板都提供相同的变量。
    在这里插入图片描述

    3.自定义上下文处理器 && 使用

    (1)在主目录下新建一个名为“mycontexprocessor.py”的文件专门用于编写自定义上下文处理器:

    此处就实现上述所说的网上的那个例子,所以在这个文件中添加获取用户IP地址的代码。

    (小提醒:自定义上下文处理器也可以放在该项目的任意可以导入的地方【一般放在 app根目录里面~】)
    ?

    详细步骤:

    1. 在主目录下创建了一个mycontextprocessor.py的文件.
    2. 在mycontextprocessor.py的文件中创建一个mytest的函数
    3. 必须传入request这个参数
    4. 必须返回一个字典类型的对象.

    在这里插入图片描述

    (2)将mytest注册到settings.py中上下文配置项里:

    在这里插入图片描述

    先找到文件所在的位置,再把自定义的上下文处理器的函数添加即可。(TEMPLATES->OPTIONS->context_processors中)

    (3)在页面模板中添加标记:

    在这里插入图片描述
    完成上述代码后,Django调用模板时会先通过上下文处理器进行处理,并将处理后返回的数据字典传入模板,通过模板标记获取数据。

    此时,我们就可以打开开发服务器,进行访问测试了。

    在这里插入图片描述

    cs