zoukankan      html  css  js  c++  java
  • Django 模板

    1. 模板的功能

    产生html,控制页面上展示的内容。模板文件不仅仅是一个html文件。

    模板文件包含两部分内容:

    1)  静态内容:css,js,html。

    2)  动态内容:用于动态去产生一些网页内容。通过模板语言来产生。

    2. 模板文件的使用

    通常是在视图函数中使用模板产生html内容返回给客户端。

    a)  加载模板文件 loader.get_template

    获取模板文件的内容,产生一个模板对象。

    b)  定义模板上下文 RequeseContext

    给模板文件传递数据。

    c)  模板渲染产生html页面内容 render

    用传递的数据替换相应的变量,产生一个替换后的标准的html内容。

    3. 模板文件加载顺序

     

    1)  首先去配置的模板目录下面去找模板文件。

    2)  找不到就去INSTALLED_APPS下面的每个应用的templates去找模板文件,前提是应用中必须有templates文件夹。

    4. 模板语言

    模板语言简称为DTL。(Django Template Language)

    4.1 模板变量

    模板变量名是由数字,字母,下划线和点组成的,不能以下划线开头。

    使用模板变量:{{模板变量名}}

    模板变量的解析顺序:

    例如:{{ book.btitle }}

    1)  首先把book当成一个字典,把btitle当成键名,进行取值book['btitle']

    2)  把book当成一个对象,把btitle当成属性,进行取值book.btitle

    3)  把book当成一个对象,把btitle当成对象的方法,进行取值book.btitle

    例如:{{book.0}}

    1)  首先把book当成一个字典,把0当成键名,进行取值book[0]

    2)  把book当成一个列表,把0当成下标,进行取值book[0]

    如果解析失败,则产生内容时用空字符串填充模板变量。

    使用模板变量时,.前面的可能是一个字典,可能是一个对象,还可能是一个列表。

    4.2 模板标签

    {% 代码段 %}

        for循环:

        {% for x in 列表 %}

        # 列表不为空时执行

        {% empty %}

        # 列表为空时执行

        {% endfor %}

    可以通过{{ forloop.counter }}得到for循环遍历到了第几次,从1开始。

    {% if 条件 %}

    {% elif 条件 %}

    {% else %}

    {% endif %}

    关系比较操作符:> < >= <= == !=

    注意:进行比较操作时,比较操作符两边必须有空格。

    逻辑运算:not and or

    4.3 过滤器

    过滤器用于对模板变量进行操作。

    date:改变日期的显示格式。

    length:求长度。字符串,列表.

    default:设置模板变量的默认值。

    格式:模板变量|过滤器:参数

    4.4 自定义过滤器。

    (1) 在app中添加包名

    (2) 自定义函数

    自定义的过滤器函数,至少有一个参数,最多两个

    (3) 在html导入 自定义过滤器函数的.py文件名

    5. 模板继承

    模板继承也是为了重用html页面内容

    在父模板里可以定义块,使用标签:

    {% block 块名 %}

    块中间可以写内容,也可以不写

    {% endblock 块名%}

    子模板去继承父模板之后,可以重写父模板中的某一块的内容。

    继承格式:{% extends 父模板文件路径%}

    {% block 块名 %}

    {{ block.super}} # 如果想获取父模板中块的默认内容

    重写的内容

    {% endblock 块名%}

              

    6. html转义

    编辑商品详情信息,数据表中保存的是html内容。

    在模板上下文中的html标记默认是会被转义的。

    小于号< 转换为&lt;

    大于号> 转换为&gt;

    单引号' 转换为&#39;

    双引号" 转换为 &quot;

    与符号& 转换为 &amp;

    要关闭模板上下文字符串的转义:可以使用 {{ 模板变量 | safe}}

    也可以使用:

    {% autoescape off %}

        模板语言代码

    {% endautoescape %}

    模板硬编码中的字符串默认不会经过转义,如果需要转义,那需要手动进行转义

    7. csrf攻击

    CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。

    CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

    django防止csrf的方式:

    1) 默认打开csrf中间件。

    2) 表单post提交数据时加上{% csrf_token %}标签。

    防御原理:

    1)  渲染模板文件时在页面生成一个名字叫做csrfmiddlewaretoken的隐藏域。

    2)  服务器交给浏览器保存一个名字为csrftoken的cookie信息。

    3)  提交表单时,两个值都会发给服务器,服务器进行比对,如果一样,则csrf验证通过,否则失败。

     说明:

    当启用中间件并加入标签csrf_token后,会向客户端浏览器中写入一条Cookie信息,这条信息的值与隐藏域input元素的value属性是一致的,

    提交到服务器后会先由csrf中间件进行验证,如果对比失败则返回403页面,而不会进行后续的处理。

    8. 验证码

    在用户注册、登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻业务服务器、数据库服务器的压力。

    from PIL import Image, ImageDraw, ImageFont
    from django.utils.six import BytesIO
    
    
    def verify_code(request):
        # 引入随机函数模块
        import random
        # 定义变量,用于画面的背景色、宽、高 RGB
        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 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
        # 随机选取4个值作为验证码
        rand_str = ''
        for i in range(0, 4):
            rand_str += str1[random.randrange(0, len(str1))]
    
        # 构造字体对象          
        font = ImageFont.truetype('kumo.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')

    服务端代码

    9.反向解析

    当某一个url配置的地址发生变化时,页面上使用反向解析生成地址的位置不需要发生变化。

    根据url 正则表达式的配置动态的生成url。

    在项目urls中包含具体应用的urls文件时指定namespace;

    在应用的urls中配置是指定name;

     反向解析应用在两个地方:模板中的超链接,视图中的重定向。

    在模板文件中使用时,格式如下:

    {% url 'namespace名字:name' %} 例如{% url 'booktest:fan2'%}

    带位置参数:

    {% url 'namespace名字:name' 参数 %} 例如{% url 'booktest:fan2' 1%}

    带关键字参数:

    {% url 'namespace名字:name' 关键字参数 %} 例如{% url 'booktest:fan2' id=1 %}

    在重定向的时候使用反向解析:

    from django.core.urlresolvers import reverse

    无参数:

    reverse('namespace名字:name名字')

    如果有位置参数

    reverse('namespace名字:name名字', args = 位置参数元组)

    如果有关键字参数

    reverse('namespace名字:name名字', kwargs=字典)

  • 相关阅读:
    linux sed 命令,sed -i
    linux子系统的初始化_subsys_initcall()
    jsp动作之 getProperty
    jsp动作之 setProperty
    eclipse jsp:useBean搞死人了。
    JSP中scope属性 scope属性决定了JavaBean对象存在的范围
    [转]mysql日常工作手记
    [转]mysql-mmm集群(多实例)
    Lua脚本语言入门学习其应用教程
    15分钟入门lua
  • 原文地址:https://www.cnblogs.com/ykgo/p/9343333.html
Copyright © 2011-2022 走看看