<学习笔记>从零开始自学Python-之-web应用框架Django( 十二)上下文处理器

news2024/11/18 21:44:01

1.在模板中处理上下文处理    

        上下文就是一系列模板变量和相应的值。模板使用上下文填充变量,放到标签里显示在页面。在 Django 中,上下文使用 django.template 模块中的 Context 类表示。 它的构造方法接受一个可选参数:一个字典,把变量名映射到值上。“填充”模板的方式是,在 Template 对象 上调用 render() 方法,并传入上下文,如我们前面写的视图函数classnotice:

from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/')
def classnotice(request):
    print(request.GET)
    now=datetime.datetime.now()
    context={}
    context['student_list']=Student.objects.all().order_by('-score')
    context['teacher']='王重阳'
    context['now']=now
    
    return render(request,'class3.html',context=context,status=200)

上下文变量查找:

        模板系统能优雅处理很多复杂的数据结构,例如列表、字典和自定义的对象。遍历 Django 模板 中复杂数据结构的关键是点号 "." 。 点号可以访问字典的键、属性、方法或对象的索引。

如我们在class3.html的标签中用点号 . 访问student的具体属性

{% extends "base.html" %}
{% block title %}武侠三班的小窝 {% endblock %}
{% load my_tags %}
{% block main %}
<h1>通知</h1>
<p>本次中期比武,{{ student_list.0.name }}获得了第一名</p>
<p>获得优秀的同学还有{{student_list.1.name}}、{{student_list.2.name}}、{{student_list.3.name}}等</p>
<p>希望其他同学以他们为榜样,苦练武功,争取下次比武取得好成绩</p>
<ul>
{% for s in student_list %}
{% if s.sex == 'male' %}
<li>{{ s.name }}大侠的成绩为 {% chengfa s.score 10 %}</li>
{% else %}
{% chufa s.score 10 as jg %}
<li>{{ s.name }}女侠的成绩为 {{jg}} </li>
{% endif %}
{% endfor %}
</ul>
<p>落款:你们尊敬的老师<br />{{ teacher }}</p>
<p>日期: {{ now|date:"D d M Y" }} </p>
{% endblock %}

注意,跟Python中不同的是,这里无论字典还是列表,都是用 . 来获取值。

2.上下文处理器

        每个视图都可以返回自己的数据,但是有些数据全局都需要使用,比如用户信息等,这时候如果每个视图函数都来获取一遍用户信息再传给标签,就会显得繁琐。

这时候就可以用到Django的上下文处理器,一些反复用到的数据可以放在上下文处理器中,在全局模板中都可以使用,就没有必要在每个视图函数中都返回这个对象。

2.1自定义上下文处理器:

        上下文处理器的接口十分简单,它就是普通的 Python 函数,有一个参数,是一个 HttpRequest 对象,返回一 个字典,用于添加到模板上下文中。上下文处理器必须返回一个字典。下面是自定义处理器的

比如我们现在想把用户名放在上下文处理器中,在views.py中写一个视图函数:

def custom_name(request):
    # 一个上下文处理器,提供 'app'、'user' 和 'ip_address'
    return {
    'yonghu': request.user.name,  #这里注意不要再用user作变量名,容易跟系统的user重名
    }


然后在setting里面设置为全局变量

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'newweb.views.custom_name',
            ],
        },
    },
]

然后我们直接在base.html中引用这个上下文:

<div class="header">
  <h1>武侠世界</h1>
  <p>武林人士自己的线上江湖</p>
  <p>欢迎你,{{yonghu}}</p>
  {% block title %}
  武侠二班主页
  {% endblock title %}
</div>

注意这里不需要再引用函数名了,直接用函数定义的变量名 yonghu,就可以获取到这个值

2.2 关于自定义上下文处理器的tips:

• 上下文处理器应该尽量负责较少的功能。处理器易于合用,因此应该把功能分成逻辑片段,供以后复用。

• TEMPLATE_CONTEXT_PROCESSORS 中列出的各个上下文处理器在那个设置文件管辖的每个模板中都可用,因此应该为变量挑选不易与模板自身设定的变量冲突的名称。因为变量区分大小写,所以让处理器提供的变量都使用大写不失为一个好主意。

• 自定义的上下文处理器可以放在代码基的任何位置。Django 只关心TEMPLATES 设置中的 'context_processors' 选项或者 Engine 的 context_processors 参数(直接使用 Engine 时)有没有指向你的上下文处理器。尽管如此,约定的做法是把上下文处理器保存在应用或项目中一个名为 context_processors.py 的文件中。

3.Django内置上下文处理器:

Django内置了一些上下文处理器,刚刚我们设置的setting表中也列出了默认启动的几个

3.1 auth

django.contrib.auth.context_processors.auth

        启用这个处理器后,RequestContext 中将包含下述变量:

        • user:auth.User 的实例,表示当前登录的用户(如未登录,是 AnonymousUser 实例)。

        • perms:django.contrib.auth.context_processors.PermWrapper 实例,表示当前登录用户拥有的权限。

3.2 debug

django.template.context_processors.debug

        启用这个处理器后,RequestContext 中将包含下面两个变量,但前提是 DEBUG 设置的值是 True,而且 INTERNAL_IPS 设置中包含请求的 IP 地址(request.META['REMOTE_ADDR']):

• debug:True。可以在模板中测试是否在 DEBUG 模式中。

• sql_queries:{'sql': …, 'time': …} 字典构成的列表,表示处理请求的过程中执行的 SQL 查询及其 用时。列表中的值按查询的执行顺序排列,在访问时惰性生成。

3.3 i18n

django.template.context_processors.i18n

        启用这个处理器后,RequestContext 中将包含下面两个变量:

• LANGUAGES:LANGUAGES 设置的值。

• LANGUAGE_CODE:如果 request.LANGUAGE_CODE 存在,返回它的值;否则返回 LANGUAGE_CODE 设置的值。

3.4 media

django.template.context_processors.media

启用这个处理器后,RequestContext 中将包含 MEDIA_URL 变量,提供 MEDIA_URL 设置的值。

3.5 static

django.template.context_processors.static

启用这个处理程序后,RequestContext 中将包含 STATIC_URL 变量,提供 STATIC_URL 设置的值。

3.6 csrf

django.template.context_processors.csrf

这个处理器添加一个令牌,供 csrf_token 模板标签使用,用于防范跨站请求伪造。

3.7 request

django.template.context_processors.request

启用这个处理器后,RequestContext 中将包含 request 变量,它的值是当前的 HttpRequest 对象。

3.8 messages

django.contrib.messages.context_processors.messages

启用这个处理器后,RequestContext 中将包含下面两个变量:

• messages:消息框架设定的消息列表(里面的值是字符串)。

• DEFAULT_MESSAGE_LEVELS:消息等级名称到数字值的映射。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/388769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HCIE-Cloud Computing LAB备考第二步:逐题攻破--第二题:FusionAccess-思维导图+题目=建立逻辑

第二题 FusionAccess markmap思维导图1 将上述思维导图跟下述题目结合,以题目顺序辅助记忆思维导图,有了思维大纲,做起实验,也就有逻辑线路,必定手掐把拿。 2.1 搭建FA实验环境(随机二考一) FA1、FA2两台服务器,请通过VNC登陆,按照题目要求根据服务器参数选择安装对…

推荐几款主流好用的markdown编辑器

介绍 随着技术的不断发展和人们对效率的追求&#xff0c;Markdown 编辑器已经成为了许多人写作的首选工具。Markdown 是一种轻量级的标记语言&#xff0c;使用简单&#xff0c;方便快捷&#xff0c;且可以方便地转换成各种格式的文件。在这篇文章中&#xff0c;我们将介绍几款…

移动端适配之动态 rem 方案

代码 就是设置浏览器字体&#xff0c;从而实现根据屏幕动态计算大小 <script>const WIDTH 750; // 设计图尺寸const setView () > {document.documentElement.style.fontSize screen.width / WIDTH "px";};window.onorientationchange setView;setVi…

JUC入门 | 黑马

一、进程和线程 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至CPU&#xff0c;数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理I0的 当一个程序被运行&a…

OpenGL中的坐标系

1、2D笛卡尔坐标系2D笛卡尔坐标系跟我们高中的时候学习的坐标系一样&#xff0c;是由x、y决定的。2、3D笛卡尔坐标系3D笛卡尔坐标系坐标由x、y、z决定&#xff0c;满足右手定则。3、视口glViewport(GLint x,GLint y,GLsizei width,GLsizei height)窗口和视口大小可以相同&#…

手敲Mybatis-反射工具天花板

历时漫长的岁月&#xff0c;终于鼓起勇气继续研究Mybatis的反射工具类们&#xff0c;简直就是把反射玩出花&#xff0c;但是理解起来还是很有难度的&#xff0c;涉及的内容代码也颇多&#xff0c;所以花费时间也比较浩大&#xff0c;不过当了解套路每个类的功能也好&#xff0c…

@mixin与@include介绍

目录mixin与include介绍定义一个mixin使用mixin传递变量如何引入mixinmixin与include介绍 在Sass里面&#xff0c;我们经常会见到mixin与include。 其中 mixin允许定义一个可以在整个样式表中重复使用的样式 include就是将我们定义的mixin引入到文档中 定义一个mixin mixin…

【春招面经】视源股份前端一面

前言 本次主要记录一下视源股份CVTE前端一面 &#xff08;3.3下午4点15&#xff09; 文章目录前言本次主要记录一下视源股份CVTE前端一面 &#xff08;3.3下午4点15&#xff09;问题总结介绍一下项目的来源以及做这个项目的初衷一直监听滚动&#xff0c;有没有对性能产生影响&a…

大数据技术之——zeppelin数据清洗

一、zeppelin的安装zeppelin解压后进入到conf配置文件界面。修改zeppelin-site.xml[roothadoop02 conf]# cp zeppelin-site.xml.template zeppelin-site.xml[roothadoop02 conf]# vim zeppelin-site.xml将IP地址和端口号设置成自己的修改 zeppelin-env.shexport JAVA HOME/opt/…

Linux小黑板(10):信号

我们写在linux系统环境下写一个程序&#xff0c;唔&#xff0c;"它的功能是每隔1s向屏幕打印hello world。"这时&#xff0c;我们在键盘上按出"Ctrl C"后,进程会发生什么&#xff1f;&#xff1f;我们清晰地看到&#xff0c;进程已经在我们按出"Ctrl…

UML2——行为图

目录 一、前言 二、活动图 三、交互图 3.1 一般序列图 3.2 时间约束序列图 3.3 协作图 四、用例图 五、状态图 一、前言 UML 是由视图&#xff08;View&#xff09;、图&#xff08;Diagrams&#xff09;、模型元素&#xff08;Model elements&#xff09;和通用机制等几…

(图像分割)基于图论的归一化分割

解释&#xff1a;将图像映射成图&#xff0c;以图为研究对象&#xff0c;利用图的理论知识获得图像的分割。 下面介绍&#xff1a;图的基本理论&#xff0c;基于图论的归一化分割算法 一、图的基本理论 图G&#xff1d;&#xff08;V&#xff0c;E&#xff0c;&#xff09;&…

《管理世界》数据复现:国有资本参股如何影响民营企业?——基于债务融资视角的研究

摘要&#xff1a; 本文以债务融资为切入点&#xff0c;从“未阐明的规则”和“阐明的规则”两个层面探讨了国有资本参股的“反向混改”是否以及如何影响民营企业。研究发现&#xff1a;国有资本参股可以显著降低民营企业的债务融资成本&#xff0c;扩大债务融资规模。…

性能测试——LoadRunner: Controller的使用

Controller Controller是用来创建测试环境&#xff0c;执行在VUG中编写的测试脚本 可以直接点击Controller的快捷方式打开,也可以在VUG中打开 这里将虚拟用户数设置为3,比较适合自己的电脑性能 整个controller分为下面几个模块 这里先设置左下角的目标计划 设置初始化:双击…

PHP 8.1.14升级低版本openssl扩展的操作方法

问题背景&#xff1a; PHP8.1.4内嵌openssl源码编译出来的openssl库版本号是1.0.2.x系列&#xff0c;低版本的openssl扩展存在安全漏洞&#xff0c;需要将该扩展升级openssl 社区最新版本3.0.8 操作步骤&#xff1a; 安装最新版本的openssl wget https://github.com/openssl…

Java面试总结(四)

synchroize的实例、静态、代码块的锁对象 修饰实例方法 修饰静态方法 修饰代码块 1、修饰实例方法 &#xff08;锁当前对象实例&#xff09; 给当前对象实例加锁&#xff0c;进入同步代码前要获得 当前对象实例的锁 。 synchronized void method() {//业务代码 }2、修饰静…

在vue中如果computed属性是一个异步操作怎么办?

在计算属性中使用异步方法时&#xff0c;可以使用async/await来处理异步操作。由于计算属性是基于它们的依赖缓存的&#xff0c;所以我们需要使用一个返回Promise的异步方法来确保计算属性能够正常运行。 下面是一个简单的示例&#xff0c;演示如何在计算属性中使用异步方法&am…

P6入门:P6 Professional常用快捷键/热键

目录 一 引言 Primavera P6 专业版 Primavera P6 EPPM&#xff08;网络客户端&#xff09; Primavera P6 Alt 键 Primavera P6 功能键 一 引言 在 Oracle Primavera P6 中&#xff0c;有热键命令可以节省宝贵的时间。尤其是作为一个与 Primavera P6 长打交道人熟练掌握这…

苹果手机备份的文件在电脑什么地方 苹果备份文件怎么查看

在这个网络信息时代&#xff0c;为手机进行定期备份已经成为了家常便饭。在使用备份软件对苹果手机进行备份后&#xff0c;苹果手机备份的文件在什么地方&#xff0c;苹果备份文件怎么查看呢&#xff1f;本文就带大家来了解一下。 一、苹果手机备份的文件在电脑什么地方 大家…

数据库三大范式、BC范式、第四范式

目录第一范式&#xff08;1NF&#xff09;&#xff1a;原子性&#xff08;存储的数据应该具有“不可再分性”&#xff09;第二范式&#xff08;2NF&#xff09;&#xff1a;唯一性 (消除非主键部分依赖联合主键中的部分字段)&#xff08;一定要在第一范式已经满足的情况下&…