模板使用
一、模板介绍
1,作为Web框架,Django提供了模板,可以很便利的动态生成HTML
2,模版系统致力于表达外观,而不是程序逻辑
3,模板的设计实现了业务逻辑(view)与显示内容(template)的分离,
二、模板引擎
在Django框架中,可以使用两种模板引擎,一种是 默认的Django模板引擎 ,还有一种叫做其他 ,
比如Jinja2模板引擎 ;
1,模版引擎的作用和优点
模版引擎作用 是将View视图中需要在前端HTML页面中展示的数据,通过模板引擎的语法规则,展示出来;
模版引擎优点 是将业务逻辑的Python代码和页面设计的HTML代码分离,使代码更干净整洁更容易维护,使Python程序员和HTML/CSS程序员分开协作,提高生产的效率,且将HTML代码分离出来,还能使其能够复用;
2,配置引擎
pip install jinja2
TEMPLATES = [
{
‘BACKEND’: ‘django.template.backends.jinja2.Jinja2’,
‘DIRS’: [os.path.join(BASE_DIR,‘templates’)],
‘APP_DIRS’: True,
‘OPTIONS’: {
‘context_processors’: [
‘django.template.context_processors.debug’,
‘django.template.context_processors.request’,
‘django.contrib.auth.context_processors.auth’,
‘django.contrib.messages.context_processors.messages’,
],
},
},
{
‘BACKEND’: ‘django.template.backends.django.DjangoTemplates’,
‘DIRS’: [os.path.join(BASE_DIR,‘templates’)],
‘APP_DIRS’: True,
‘OPTIONS’: {
‘context_processors’: [
‘django.template.context_processors.debug’,
‘django.template.context_processors.request’,
‘django.contrib.auth.context_processors.auth’,
‘django.contrib.messages.context_processors.messages’,
],
},
},
]
模板语法
一、注释
注释后的内容在网页源文件中不可见
1,单行
{# msg #}
2,多行
{% comment %}
{% endcomment %}
ctrl+/ 产生的注释仍然被django模板显示
二、变量打印
{{变量名}}
假如没有给模板引擎传递响应的变量,那么该位置不显示任何数据
三、条件判断
{% if a == b %}
{% elif a > b %}
{% else %}
{% endif %}
变量逻辑判断必须以空格隔开
四、循环
{% for item in items %}
{% empty %} 假如循环的迭代对象没有元素,输入empty中内容
{% endfor %}
五、过滤器
{ { 变量|过滤器 }}
针对变量使用特定过滤器处理
{ { name|lower|upper|default:‘zzy’|join:"++"|length }}
六、转义
默认django中是把自动转义打开,如果需要关闭自动转义
1,块转义
{% autoescape off %}
{% endautoescape %}
2,变量转义
{{ var|safe }}
七、跨站请求伪造保护(在下文中见详细说明)
{% csrf_token %}
八、继承标签
{% extends ‘base.html’ %}
{% block content %}
子模板自定的内容
{% endblock %}
九、包含
{% include “footer.html” %}
把制定的模板内容添加到当前模板中
跨站请求伪造
csrf
全称Cross Site Request Forgery,跨站请求伪造
某些恶意网站上包含链接、表单按钮或者JavaScript,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完成某些操作,这
就是跨站攻击
在django的模板中,提供了防止跨站攻击的方法
在settings.py中启用’django.middleware.csrf.CsrfViewMiddleware’中间件,此项在创建项目时,默认被启用
1,{ % csrf_token % }模板标签
2,如果某些视图不需要保护,可以使用装饰器csrf_exempt,模板中也不需要写标签,修改csrf2的视图如下
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
保护原理
加入标签后,可以查看源代码,发现多了如下代码
django的csrf不是完全的安全
保持状态
一、状态保持
http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据
存储方式包括cookie、session
使用cookie,所有数据存储在客户端,注意不要存储敏感信息
使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_id
推荐使用session
二、使用Cookie
cookie是由服务器生成,存储在浏览器端的一小段文本信息。
cookie的特点:
以键值对方式进行存储。
通过浏览器访问一个网站时,会将浏览器存储的跟网站相关的所有cookie信息发送给该网站的服务器。
服务端获取请求所携带的cookie 可以使用 request.COOKIES
cookie是基于域名安全的。www.baidu.com www.tudou.com之间的cookie互不影响
cookie是有过期时间的,如果不指定,默认关闭浏览器之后cookie就会过期。
在响应中设置
res = HttpResponse()
res.set_cookie(key=“username”, value=“zzy”, expires=timezone.now()+timedelta(days=7))
在响应中清除
res.delete_cookie(key=“username”)
从请求中获取
name = request.COOKIES.get(“username”)

三、使用session
session存储在服务器端。
session的特点:
session是以键值对进行存储的。
session依赖于cookie。唯一的标识码sessionid保存在 cookie中。
session也是有过期时间,如果不指定,默认两周就会过期。
设置
request.session[“username”] = “zzy”
request.session.set_expiry(606024*7)
获取
request.session.get(“username”)
清除
request.session.flush()

四、session的存储
在settings.py文件中
项INSTALLED_APPS列表中添加:
‘django.contrib.sessions’,
项MIDDLEWARE_CLASSES列表中添加:
‘django.contrib.sessions.middleware.SessionMiddleware’,
可以使用settings.py的SESSION_ENGINE项指定
基于本地数据库
SESSION_ENGINE=‘django.contrib.sessions.backends.db’
基于缓存
SESSION_ENGINE=‘django.contrib.sessions.backends.cache’
缓存和数据库同时使用
SESSION_ENGINE=‘django.contrib.sessions.backends.cached_db’
基于数据库的太慢,基于缓存的容易丢失
那么最好使用基于redis的内存数据库最好
需要安装模块
pip install django-redis-sessions
修改settings中的配置,增加如下项
SESSION_ENGINE = ‘redis_sessions.session’
SESSION_REDIS_HOST = ‘localhost’
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = ‘’
SESSION_REDIS_PREFIX = ‘session’
可以通过redis-cli查看