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转义

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

  • >转义为&gt;
  • <转义为&lt;
  • '转义为&#39;
  • "转义为&quot;
  • &转义为&amp;
  • 关闭转义:
      1. 过滤器safe,示例:{{ data | safe}}
      1. 使用autoescape,示例:
        {% autoescape off %}
        代码块...
        {% endescape %}
        模板硬编码不转义,如:{{ data | default:'<h1>hello world</h1>'}}

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标签:
    <a href="{% url 'booktedt:index' %}">首页</a>
  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. 超链接传参:
    <a href="{% url 'booktest:index' 2 3 %}">首页</a> # 自动解析为/booktest/index/2/3
    b. 重定向传参:

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

  1. 关键字参数:
    url配置:
    url(r'^index/(?P<id>\d+)/(?P<age>\d+)$', views.index, name='index')
    a. 超链接传参:
    <a href="{% url 'booktest:index' id=2 age=10 %}">首页</a>
    b. 重定向传参:
    return redirect(reverse('booktest:index', kwargs={'id':2,'age':10}))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容