django 进阶--模板

模板概述

  • 模板包含两部分
  • 静态部分,包含html、css、js
  • 动态部分,就是模板语言
  • Django模板语言,简写DTL,定义在django.template包中
Django处理模板分为两个阶段
  • 1.加载:根据给定的路径找到模板文件,编译后放在内存中
  • 2.渲染:使用上下文数据对模板插值并返回生成的字符串

视图调用模板
调用模板分为三步骤:
  • 1.找到模板
  • 2.定义上下文
  • 3.渲染模板
打开booktst/views.py文件,调用上面定义的模板文件
from django.http import HttpResponsefrom django.template import loader,RequestContextdef index(request): # 1.获取模板 template=loader.get_template('booktest/index.html') # 2.定义上下文 context=RequestContext(request,{'title':'图书列表','list':range(10)}) # 3.渲染模板 return HttpResponse(template.render(context))

视图调用模板简写
视图调用模板都要执行以上三部分,于是Django提供了一个函数render封装了以上代码。 方法render包含3个参数:
  • 第一个参数为request对象
  • 第二个参数为模板文件路径
  • 第三个参数为字典,表示向模板中传递的上下文数据
打开booktst/views.py文件,调用render的代码如下:
from django.shortcuts import renderdef index(request): context={'title':'图书列表','list':range(10)} return render(request,'booktest/index.html',context)

模板语言
模板语言包括4种类型,分别是:
  • 变量
变量语法如下:
{{变量}}
  • 变量的作用是计算并输出
  • 变量名必须由字母、数字、下划线(不能以下划线开头)和点组成
  • 当模版引擎遇到点如book.title,会按照下列顺序解析:
  • 1.字典book['title']
  • 2.先属性后方法,将book当作对象,查找属性title,如果没有再查找方法title()
  • 3.如果是格式为book.0则解析为列表book[0]
  • 如果变量不存在则插入空字符串
  • 在模板中调用方法时不能传递参数
标签{%代码段%}
语法如下
{%代码段%}

加载静态文件夹标签
{%load static from staticfiles%}<img src="{%static "img/sg.png" %}"/>

反向解析url标签
{%url 'namespace:name'%}<img src="{%url "namespace:name" %}"/>
for标签语法如下
{%for item in 列表%}循环逻辑 {{forloop.counter}} 表示当前是第几次循环,从1开始 {%empty%} 列表为空或不存在时执行此逻辑 {%endfor%}
if标签语法如下
{%if ...%}逻辑1{%elif ...%}逻辑2{%else%}逻辑3{%endif%}
比较运算符如下 注意: 运算符左右两侧不能紧挨变量或常量,必须有空格
==!=<><=>=
布尔运算符如下
andornot

过滤器
语法如下:
  • 使用管道符号|来应用过滤器,用于进行计算、转换操作,可以使用在变量、标签中
  • 如果过滤器需要参数,则使用冒号:传递参数
变量|过滤器:参数
常用过滤器
  • 长度length,返回字符串包含字符的个数,或列表、元组、字典的元素个数
  • 默认值default,如果变量不存在时则返回默认值
data|default:'默认值'
  • 日期date,用于对日期类型的值进行字符串格式化,常用的格式化字符如下
  • Y表示年,格式为4位,y表示两位的年
  • m表示月,格式为01,02,12等
  • j表示日,格式为1,2等
  • H表示时,24进制,h表示12进制的时
  • i表示分,为0-59
  • s表示秒,为0-59
value|date:"Y年m月j日 H时i分s秒"

自定义过滤器
过滤器就是python中的函数,注册后就可以在模板中当作过滤器使用,下面以求余为例开发一个自定义过滤器mod。
创建自定义过滤器
在应用中创建templatetags包,当前示例为”booktest/templatetags“,创建init文件,内容为空。
在”booktest/templatetags“目录下创建filters.py文件,代码如下:
#引入注册对象from django.template import Libraryregister=Library()#使用装饰器进行注册@register.filter#定义求余函数mod,将value对2求余def mod(value): return value%2
过滤器还可以接收参数,将booktest/templatetags/filters.py中增加mod_num函数
#使用装饰器进行注册@register.filter#定义求余函数mod_num,将value对num求余def mod_num(value,num): return value%num

注释
在模板中使用如下模板注释,这段代码不会被编译,不会输出到客户端;html注释只能注释html内容,不能注释模板语言。
单行注释语法如下:
{#...#}
注释可以包含任何模版代码,有效的或者无效的都可以:
{# { % if foo % }bar{ % else % } #}
多行注释使用comment标签,语法如下:
{%comment%}...{%endcomment%}


模板继承
  • 模板继承和类的继承含义是一样的,主要是为了提高代码重用,减轻开发人员的工作量
  • 典型应用:网站的头部、尾部信息
父模板
  • 如果发现在多个模板中复制一段代码,那就应该把这段内容定义到父模板中
  • 标签block:用于在父模板中预留区域,留给子模板填充差异性的内容,名字不能相同
  • 为了更好的可读性,建议给endblock标签写上名字,这个名字与对应的block名字相同
  • 父模板中也可以使用上下文中传递过来的数据

{%block 名称%}预留区域,可以编写默认内容,也可以没有默认内容{%endblock 名称%}
子模板
标签extends:继承,写在子模板文件的第一行
{% extends "父模板路径"%}
#子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值
#填充父模板中指定名称的预留区域
{%block 名称%}实际填充内容 {{block.super}}用于获取父模板中block的内容 {%endblock 名称%}

HTML转义
模板对上下文传递的字符串进行输出时,会对以下字符自动转义,转义后标记代码不会被直接解释执行,而是被直接呈现,防止客户端通过嵌入js代码攻击网站。
小于号< 转换为&lt;大于号> 转换为&gt;单引号' 转换为&#39;双引号" 转换为 &quot;与符号& 转换为 &amp;

模板默认自动转义,加safe过滤期则不转义
不转义:{{ title|safe }}

标签autoescape:off设置一段代码都不转义,on转义
{%autoescape off%}...{%endautoescape%}

CSRF
  • CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。
  • CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。
  • 包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......
  • 造成的问题:个人隐私泄露以及财产安全。

防止CSRF攻击
提示:Django默认开启了CSRF安全验证功能


有csrftoken的网页源码

总结
1.当启用中间件并加入CSRF标签后,会向客户端浏览器中写入一条Cookie信息,这条Cookie信息的值与隐藏的input标签的value是一致的,提交到服务器时会先由csrf中间件进行验证,验证Cookie和和input的value是否一致,如果对比失败则返回403页面,而不会进行后续的处理
2.重要信息发送POST请求提交到服务器


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值