Django_模板

5 篇文章 0 订阅
1 篇文章 0 订阅

模板介绍

  • 模板致力于表达外观,而不是程序逻辑;设计实现了业务逻辑view 与显示内容template的解耦
  • 模板包含两部分
    • 静态:包含html、css、js
    • 动态:就是模板语言(简写DTL,定义在django.template)
# 模板处理
1.加载: 根据给定的路径找到模板文件,编译后放在内存中
2.渲染: 使用上下文数据对模板传值并返回动态生成的网页
模板配置:'DIRS': [os.path.join(BASE_DIR, 'templates')]

模板语言

  • 作用:获取、处理传入到模板中的上下文数据,动态的产生页面内容
  • 包含4种类型:1.变量, 2.标签 , 3.过滤器(可自定义), 4.注释
# 变量
作用:计算并输出上下文传入的数据.
语法:{{变量}}
变量名规则:由字母、数字、下划线和点组成(不能以下划线开头).
## 变量解析规则:当模板引擎遇到点如book.name,会按照下列顺序解析.
1.字典book['name']
2.先属性后方法,将book当作对象,查找属性name,如果没有再查找方法那么()
3.如果是格式为book.0则解析为列表book[0]
如果变量不存在则插入空字符串"".
在模板中调用方法时不能传递参数(使用带参数方法,需要使用过滤器)
# 标签
语法:{% 代码段 %}
- for循环标签
{% for item in 列表 %} 执行循环逻辑
 {{ forloop.counter }}获取当前是第几次循环,
 从1开始 {% empty %} 列表为空或不存在时执行此逻辑 
{% endfor %}
- if标签
{% if ... %} 
    逻辑1
{% elif ... %} 
    逻辑2 
{% else %} 
    逻辑3 
{% endif %}
- 比较运算符标签 ,左右两侧必须有空格
==, !=, <, >, <= , >=
- 布尔运算符标签
and, or, not
# 过滤器
作用:模板语言中不允许带参数的函数,如果要对变量进行处理,就需要使用过滤器
使用管道符号 | 来应用过滤器,用于进行计算、转换操作,可以使用在变量、标签中
## 过滤器语法(说明:第一个参数就是变量;如果要追加参数,则使用冒号:传递参数;冒号后面最多可以传一个参数):
# | 两边不能加空格
 一个参数时:变量|过滤器
 两个参数时:变量|过滤器:参数
## 常用过滤器
length: 返回字符串、列表、元组、字典的元素个数(变量 | length)
default: 如果变量不存在时则返回默认值(变量 | default: 默认值)
date: 用于对日期类型的值进行字符串格式化
    - Y表示年,格式为4位,y表示两位的年
    - m表示月,格式为010212等
    - j表示日,格式为12等
    - H表示时,24进制,表示12进制的是时
    - i表示分,为0-59
    - s表示秒, 为0-59
    日期 | date:'Y年m月j日 H时i分s秒'
## 自定义过滤器
* 当内建过滤器无法满足需求时,需要自定义过滤器
* 过滤器就是python中的函数,注册后就可以在模板中当做过滤器使用
* 自定义过滤器的python包,必须命名为templatetags
* 创建注册对象,必须命名为register
## 注释
* 在模板中使用模板注释,注释掉某一段代码,那么这段代码不会被编译,不会输出到客户端;注释可以包含任何模板代码,有效的或者无效的都可以注释掉
    - html注释只能注释html内容,不能注释模板语言
单行注释
{#...#}
多行注释使用comment标签
{% comment %}
...
{% endcomment %}

模板继承

  • 作用:主要是为了提高代码重用,减轻开发人员的工作量
  • 典型应用: 网站的头部、尾部信息
# 父模板
- 如果发现一段代码在多个模板中出现,那就应该把这段代码内容定义到父模板中
- 父模板中也可以使用上下文中传递过来的数据 
- 父模板定义在templates文件目录
- block标签: 用于在父模板中预留区域,留给子模板填充差异性的内容
        - 可以给预留区域定义名字,但多个预留区域名字布恩那个相同
        - 为了更好的可读性,建议给endblock标签写上名字,这个名字与对应的block标签名字相同
{% block 名称 %}
    预留区域,可以编写默认内容,也可以没有默认内容
{% endblock 名称 %}

# 子模板
- 子模板定义在templates/应用 文件目录下
- extends标签:继承,写在子模板文件的第一行
- 子模板不用填充父模板中的所有预留区域,如果子模板没有填充,则使用父模板定义的默认值
{% block 名称 %}
    实际填充内容
{{block.super}} 用于获取父模板中block的内容,也可以不获取
{% endblock 名称 %}
# 注意点:
1.子模板继承父模板之后,本身原有的内容是不起作用的
2.父模板不能把上下文传给子模板,只能继承内容不继承上下文

HTML转义

  • 在视图中,通过调用模板传递上下文,模板对上下文传递的字符串进行输出时,会对以下字符自动转义
  • 作用:转义后标记代码(标签)不会被直接解释执行,而是被直接呈现,防止客户端通过嵌入js代码攻击网站
小于号 < 转换为 &lt;
大于号 > 转换为 &gt;
单引号 ' 转换为 &#39;
双引号 " 转换为 &quot;
与符号 & 转换为 &amp;
禁止HTML转义
  • 过滤器escape:可以实现对变量的HTML转义,默认模板就会转义,一般省略;{{变量 | escape}}
  • 过滤器safe : 禁用转义,告诉模板这个变量是安全的,可以解释执行;{{变量 | safe}}
  • 标签autoescape : 设置一段代码都禁用转义,接受on(启用转义)、 off(禁用转义)参数
  • 其他
    1.对于在模板中硬编码<, >, ‘, “, &不会被转义
    2.在模板中硬编码如果希望出现转义的效果,则需要手动编码转义

CSRF

  • CSRF全拼为Cross Site Request Forgery, 译为跨站请求伪造
  • CSRF 指攻击者盗用了你的身份,以你的名义发送恶意请求;造成个人隐私泄漏以及财产安全
# 总结: Django提供的CSRF防护机制
1.Django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,这样就能避免被 CSRF 攻击
2.在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token
3.在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 csrf_token标签, django 就会自动帮我们生成)
4.在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提 交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.

验证码

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

反向解析

  • 根据正则
  • 应用:模板中的超链接,视图中的重定向
# 1.项目路径
## 指定某个应用的命名空间
url = (r'^', include('Book.urls', namespace='book')),
# 2.应用的路径
url = (r'^fan123/$', fan1, name='fan1'),
## 位置参数路径
url(r'^fan123/(\d+)/(\d+)/$', fan2, name='fan2')
## 关键字参数
url(r'^fan123/(?P<num1>\d+)/(?P<num2>\d+)/$', fan3, name='fan3')
# 3.模板中应用
## 超链接
<a href='{% url "book:fan1" %}}'></a>
## 超链接位置参数
<a href='{% url "book:fan2" 18 188 %}'></a>
## 超连接关键字参数
<a href='{% url "book:fan3" num1=18 num2=188 %}'></a>
<a href='{% url "book:fan3" 18 188 %}'></a>
## 重定向
from django.core.urlresolvers import reverse
return redirect(reverse('book:fan1'))
## 重定向位置参数
return redirect(reverse('book:fan2', args=(18, 188)))
## 重定向关键字参数
return redirect(reverse('book:fan3', args=(18, 188)))
return redirect(reverse('book:fan3',kwargs=('num1':18, 'num2':188)))

配置流程

# 创建项目
django-admin startproject 项目名称
# 创建应用
cd BookManager/
python manage.py startapp 应用名称
#修改解释器路径
/home/python/.virtualenvs/py3_django/bin/python
# 运行服务器
python manage.py runserver
# 生成、执行迁移
python manage.py makemigrations
python manage.py migrate
# 界面本地化
LANGUAGE_COOE="zh-Hans"
TIME_ZONE="Asia/Shanghai"
# 创建管理员
python manage.py createsuperuser
# 配置URL
## 项目
url(r'^', include('Book.urls')),
## 应用
url(r'^booklist/$', bookList),
# 配置mysql数据库
## __init__下
import pymysql
pymysql.install_as_MySQLdb()
## settings下
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'Bookdb',
        'HOST': '192.168.80.132',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': 'mysql',
    }
}

# 创建模板文件夹templates,设置模板路径
"DIRS":[os.path.join(BASE_DIR, "templates")]

# 创建静态文件夹static,设置文件路径
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]
# 上传文件,在static下创建media,其下再创建Book
## 在settings配置文件上传时保存到的路径
MEDIA_ROOT=os.path.join(BASE_DIR, 'static/media')

# 错误视图配置(线上模式)
DEBUG = False
ALLOWED_HISTS = ['*']

# 配置自定义过滤器
## 在应用下新建templatetags(必须此名)包,在包下新建py文件定义过滤器函数,注册对象必须命名为register
## 加载过滤器{load py文件名}

# 定义父子模板
## 父模板定义在templates文件目录下
##子模板定义在templates/应用文件目录下
## 子模板中使用{% extends '父模板名' %}

# 自定义中间件
在应用中新建middleware.py文件,在文件中定义类TestMiddleware
在settings.py下配置中间件
MIDDLEWARE_CLASSES= [
        # 注册自定义中间件
        'Book.middleware.TestMiddleware',
]
# 站点管理中重写模板
在templates 目录下创建 admin目录
再在admin文件下创建base_site.html
{% extends "admin/base.html" %}

{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

{% block branding %}
{#<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>#}

{# 自定义内容 #}
<h1 id="site-name"><a href="{% url 'admin:index' %}">电商项目</a></h1>

{% endblock %}

{% block nav-global %}{% endblock %}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值