django学习笔记(四)—— T层相关学习

1. 介绍

  • 模板配置在settings.py中:
    模板配置.png

    DIRS中定义一个目录列表,模板引擎按列表顺序搜索这些目录来查找模板文件,通常在根目录下创建templates目录。模板包含两部分:

      1. 静态部分:html, css, js;
      1. 动态部分:模板语言;
  • django处理模板分为两个阶段:
      1. 加载:按照指定目录找到模板文件,编译后加载至内存;
      1. 渲染:使用上下文数据对模板插值并返回生成的字符串;
  • django提供简写模板render函数来调用模板。
  • 模板语言包含4种类型:变量标签过滤器注释

2. 模板语言

2.1 模板变量

  • 语法:{{ 变量 }}
  • 当模板引擎遇到.符号如book.title时,会安如下顺序解析:
      1. 字典:book['title']
      1. 对象属性/方法:先按book.title查找book对象的属性,再按book.title()查找book对象的title方法;
      1. 如果格式是book.0则解析为列表book[0]
    • 如多都没有则对应处为空字符串。
    • 注意:模板中调用方法时不能传递参数。

2.2 标签

  • 语法:{% 代码段 %}
    1. for标签:
      {% for item in itemlist %}
      逻辑
      {% forloop.counter%} # 表示当前是第几次循环,从1开始
      {% empty %}
      列表为空或不存在时逻辑
      {% endfor %}
    1. if标签
      {% if ... %}
      逻辑...
      {% elif ... %}
      逻辑...
      {% else %}
      逻辑...
      {% endif %}
    1. 比较运算法
      ==, !=, >, <, >=, <=
      注意:比较运算法两侧必须有空格,不能紧挨变量或常量。
    1. 布尔运算符
      and, or, not

2.3 过滤器

  • 语法:变量 | 过滤器:参数 # 注意“:”前后不能有空格
    1. length:返回字符串字符数或者列表,元组或字典的元素个数;
    1. default:变量不存在时返回默认值;
    1. date:日期类型的值进行字符串格式化:
    • Y:4位年,y表示2位年;
    • m:月,格式为01,02...
    • d:日,01, 02...
    • j:日,1,2...
    • H:24进制时
    • h:12进制时
    • i:分,0-59
    • s:秒,0-59

2.4 自定义过滤器

    1. 在应用中创建templatetags目录(需包含__ init __.py文件);
    1. 在templatetags下创建filters.py文件:
      自定义过滤器.png
    1. 使用模块:
      加载模板.png

      在模板中导入过滤器即可在下面使用。

    1. 自定义过滤器可以增加参数:
      过滤器增加参数.png

      传参仍是冒号相连。

2.5 注释

在模板中使用模板注释,代码不会被编译,不会输出到客户端,html只能注释html内容,不能注释模板语言。

    1. 单行语法注释:
      {#...#}
      -2. 多行注释:
      {%comment%}
      ...
      {%endcomment%}

3. 模板继承

父模版:
父模版内预留区域.png

子模版:
子模板.png
extends继承写在子模板文件第一行。

4. html转义

模板对上下文传递的字符串进行输出时,会对以下字符串进行自动转义:

  • >转义为>
  • <转义为<
  • '转义为'
  • "转义为"
  • &转义为&
  • 关闭转义:
      1. 过滤器safe,示例:{{ data | safe}}
      1. 使用autoescape,示例:
        {% autoescape off %}
        代码块...
        {% endescape %}
        模板硬编码不转义,如:{{ data | default:'

        hello world

        '}}

5. CSRF

CSRF:Cross Site Request Forgery,跨站请求伪造。
django防止csrf攻击:使用csrf中间件:

djangoCSRF中间件.png

使用:1. settings.py中开启中间件;2. 在post的form表单中加入csrf_token标签:{% csrf_token %}
原理:当启用中间件并加入标签csrf_token后,会向客户端浏览器中写入一条Cookie信息,这条信息的值与隐藏域input元素的value属性是一致的,提交到服务器后会先由csrf中间件进行验证,如果对比失败则返回403页面,而不会进行后续的处理。
隐藏域.png

携带cookie.png

6. 验证码

验证码在网上很多,这里以一个案例为例

    1. 安装Pillow包
      pip install Pillow==3.4.1
    1. 定义视图
from django.http import HttpResponse
from PIL import Image, ImageDraw, ImageFont
from django.utils.six import BytesIO


# Create your views here.
def verify_code(request):
    # 引入随机函数模块
    import random
    # 定义变量,用于画面的背景色/宽/高
    bgcolor = (random.randrange(20, 100), random.randrange(20, 100), 255)
    width = 100
    height = 25
    # 创建画面对象
    im = Image.new('RGB', (width, height), bgcolor)
    # 创建画笔对象
    draw = ImageDraw.Draw(im)
    # 调用画笔的point()函数绘制噪点
    for i in range(0, 100):
        xy = (random.randrange(0, width), random.randrange(0, height))
        fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
        draw.point(xy, fill=fill)
    # 定义验证码的备选项
    str1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
    # 随机选取4个值作为验证码
    rand_str = ''
    for i in range(0, 4):
        rand_str += str1[random.randrange(0, len(str1))]
    # 构造字体对象
    font = ImageFont.truetype('/static/font/Tahoma.ttf', 23)
    # 构造字体颜色
    fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
    # 绘制4个字
    draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
    draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
    draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
    draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
    # 释放画笔
    del draw
    # 存入session
    request.session['verifycode'] = rand_str
    # 内存文件操作
    buf = BytesIO()
    # 将图片保存到内存中,格式为png
    im.save(buf, 'png')
    # 将内存中的图片数据返回给客户端,MIME类型为图片png
    return HttpResponse(buf.getvalue(), 'image/png')

效果:
验证码测试.png

注意是在项目中拷贝一份字体文件:

使用字体文件.png

如果字体没找到会报错:
字体找不到报错.png
    1. 简单使用
    • 定义验证码页面:
    验证码页面.png
    • 定义视图:
    测试验证码视图.png
    • 页面效果
    验证码测试效果.png

7. 反向解析

在之前的url配置时,无论模板中链接路径还是后台返回页面地址,都是严格按url中正则表达式来写的,这样存在的问题就是一旦url中正则表达式变了,所有已经完成的路径都得作相应改动。反向解析就是解决该问题的。反向解析用在两个地方:

    1. 模板中超链接
    1. 视图中重定向
  • 反向解析使用:

先在项目urls.py包含应用url时,include中增加namespace参数:
url(r'^', include('booktest.urls', namespace='booktest'))
在应用中urls.py中配置路径时,增加name参数name参数:
url(r'^index$', views.index, name='index')

  1. 在模板超链接中使用:使用url标签:
    首页
  2. 在重定向中使用:
    a. 先导入reverse模块:
    from django.shortcuts import redirect
    from django.core.urlresolvers import reverse
    b. 在视图中重定向:
    return redirect(reverse('booktest:index'))
  • 反向解析结果:

在使用反向解析后,无论模版超链接还是重定向,都会自动根据正则表达式生成相应的链接完成跳转。

  • 反向解析传参:
  1. 位置参数:
    url配置:
    url(r'^index/(\d+)/(\d+)$', views.index, name='index')
    a. 超链接传参:
    首页 # 自动解析为/booktest/index/2/3
    b. 重定向传参:

return redirect(reverse('booktest:index', args=(2, 3)))

  1. 关键字参数:
    url配置:
    url(r'^index/(?P\d+)/(?P\d+)$', views.index, name='index')
    a. 超链接传参:
    首页
    b. 重定向传参:
    return redirect(reverse('booktest:index', kwargs={'id':2,'age':10}))

你可能感兴趣的:(django学习笔记(四)—— T层相关学习)