四.模板之标签tag
在django中全部的标签均是经过{% %}来使用。
1.If...elif..else前端
{% if person.age > 20 %} {% if person.age < 30 %} <P>{{ person.name }}的年龄大于20小于30</P> {% elif person.age < 40 %} <P>{{ person.name }}的年龄小于40</P> {% else %} <P>{{ person.name }}的年龄大于等于40</P> {% endif %} {% elif person.age <= 20 and person.age > 10 %} <P>{{ person.name }}的年龄大于10小于等于20</P> {% else %} <P>{{ person.name }}的年龄大于等于10</P> {% endif %}
if必需要用{% endif%}来进行结束,if一样可使用嵌套的用法。
2.for循环ajax
{#for循环控制语句#} <p>list类型的for循环,{{ list1 }}</p> {% for i in list1 %} {# <p> {{ i }} </p> {# 此处遍历获得的是元素 #} {# <p> 第{{ forloop.counter }}个元素是:{{ i }}</p> {# forloop.counter默认从1开始顺序计数 #} {# <p> 第{{ forloop.counter0 }}个元素是:{{ i }}</p> {# forloop.counter0 是从0开始顺序计数 #} {# <p> 倒数第{{ forloop.revcounter }}个元素是:{{ i }}</p> {# forloop.revcounter倒数进行计数,最小值默认是1 #} <p> 倒数第{{ forloop.revcounter0 }}个元素是:{{ i }}</p> {# forloop.revcounter0倒数进行计数,最小值默认是0 #} {# 注:不论是顺序计数的forloop.counter或forloop.counter0仍是逆序计数的forloop.revcounter或forloop.revcounter0;改变的只是计算的初始值而已#} {% endfor %} <hr> <p>tuple类型的for循环,{{ tuple1 }}</p> {% for t in tuple1 %} <p>第{{ forloop.counter }}个元素是:{{ t }}</p> {% endfor %} <hr> <p>dict类型的for循环,{{ data }}</p> {% for t in data %} <p>第{{ forloop.counter }}个字典的key值是:{{ t }}</p> {# 字典循环获得的是key #} {% endfor %} <hr> <p>str类型的for循环,{{ str1 }}</p> {% for s in str1 %} <p>第{{ forloop.counter }}个元素是:{{ s }}</p> {% endfor %} {# #} <hr> <p>forloop.first的用法,list2='{{ list2 }}'</p> {% for s in list2 %} {# {% if forloop.first %} {# forloop.first 结果返回布尔值 #} {# <p>第1个元素不为False,它是:{{ s }}</p>#} {# {% endif %}#} {# <p>第{{ forloop.counter }}个元素是:{{ s }}</p>#} {% empty %} <p>第{{ forloop.counter }}个元素为空</p> {% endfor %}
总结:在django模板中的for循环语句和if条件判断语句,都要用对应的endfor和endif来做为结束的标志。且,模板中的变量使用两个括号{{ varname }}而模板中的标签语句时用一个括号和百分号组合进行使用的{% tag语句 %}。django
3.{% csrf_token %}
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。后端
CSRF预防机制 CSRF的防护能够从服务端和客户端两方面着手,防护效果是从服务端着手效果比较好,如今通常的CSRF防护也都在服务端进行。 token防护的总体思路是: 第1步:后端随机产生一个token,把这个token保存在SESSION状态中;同时,后端把这个token交给前端页面; 第2步:下次前端须要发起请求(好比发帖)的时候把这个token加入到请求数据或者头信息中,一块儿传给后端; 第3步:后端校验前端请求带过来的token和SESSION里的token是否一致; Django下的CSRF预防机制 django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。而后每次 POST 请求都会带上这个 token, 这样就能避免被 CSRF ***。 在 templete 中, 为每一个 POST form 增长一个 {% csrf_token %} tag. 以下: 1.在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token 2.在全部的 POST 表单模板中,加一个{% csrf_token %} 标签,它的功能实际上是给form增长一个隐藏的input标签,以下 <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">,而这个csrf_token = cookie.csrftoken,在渲染模板时context中有context['csrf_token']=request.COOKIES['csrftoken'] 3.在经过表单发送POST到服务器时,表单中包含了上面隐藏了crsrmiddlewaretoken这个input项,服务端收到后,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否同样。若是同样,则代表这是一个合法的请求,不然,这个请求多是来自于别人的 csrf ***,返回 403 Forbidden. 4.在经过 ajax 发送POST请求到服务器时,要求增长一个x-csrftoken header,其值为 cookie 里的 csrftoken 的值,服务湍收到后,django会验证这个请求的cookie里的csrftoken字段与ajax post消息头中的x-csrftoken header是否相同,若是相同,则代表是一个合法的请求 django为用户实现防止跨站请求伪造的功能,经过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。 全局: 中间件 django.middleware.csrf.CsrfViewMiddleware 局部: @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即使settings中没有设置全局中间件。 @csrf_exempt,取消当前函数防跨站请求伪造功能,即使settings中设置了全局中间件。 注:from django.views.decorators.csrf import csrf_exempt,csrf_protect 一、原理 在客户端页面上添加csrftoken, 服务器端进行验证,服务器端验证的工做经过'django.middleware.csrf.CsrfViewMiddleware'这个中间层来完成。在django当中防护csrf***的方式有两种: 1.在表单当中附加csrftoken 2.经过request请求中添加X-CSRFToken请求头。 注意:Django默认对全部的POST请求都进行csrftoken验证,若验证失败则403错误侍候。
以下图,前端不带csrf_token时:浏览器
下图开始带csrf_token:
4.{% url '引用的url地址' %}
主要是在进行url别名时的使用,先在url中为该url设置别名,这样其余地方须要引用该地址时就能够直接使用别名便可。如图:服务器
5.{% with %}
with是将变量进行重命名(主要是将view中直接传来的复杂变量名进行简写,只能是view中现有的变量,不能是再进一步获取的变量.例如该例子中能够是view中的person,却不能是person.name。且必需要以{% endwith %}做为结束。
注意:with中进行变量赋值时,等号先后不能有空格,不然将报错不是一个变量。
6.{% verbatim %}
做用:禁止render在前端浏览器渲染该部分的变量,相似于转义符’//’表示/同样的做用。{%verbatim%}也必须以{% endverbatim%}来做为结束。
如图,须要在浏览器上显示{{data}},而不是渲染出view中data变量值:
7.自定义标签
自定义标签的新建步骤参考自定义过滤器的步骤https://blog.51cto.com/10836356/2318602;
自定义标签和上一节中的自定义过滤器的定义方法彻底相同,只是自定义标签的上方的装饰器不一样而已。
自定义标签和自定义过滤器的区别:
A.自定义过滤器函数中只能定义一个变量(加上自身共2个变量),而自定义标签函数的变量个数能够任意多;
B.自定义过滤器是做用于变量的,因此在使用时必定是在{{a|filter}}中且与做用对象用’|’隔开;而自定义标签是使用在{% tagname pram1 pram2 ...%}
C.自定义标签局限性:不能用在if等tag语句中,而filter能够用在if等tag语句中,如图:
以下图所示,能够比较二者的使用方法和效果:cookie
欢迎关注笔者我的公众号:session