Flask—02-Flask会话控制与模板引擎
会话控制原理
- 说明:概念百度说明的很详细,请自行百度
cookie
-
说明:
由于HTTP协议无状态无连接的特点,导致一个用户在同一网站做连续操作时,需要不断的提供身份信息;为了解决这个问题,我们可以通过cookie携带特定的信息加以解决。当首次访问网站时设置cookie信息,以后每次再访问该网站时,浏览器会自动携带cookie信息。
-
使用:
from flask import Blueprint, request, make_response cookie = Blueprint('cookie', __name__, url_prefix='/cookie') # 获取 @cookie.route('/get/') def get_cookie(): return request.cookies.get('name', '猴哥是我') # 设置 @cookie.route('/set/') def set_cookie(): resp = make_response('cookie已设置') # 设置cookie,默认有效期为浏览器关闭 # expires:有效期,是一个datetime类型的参数 # max_age:有效期,是一个int类型的参数,推荐使用 resp.set_cookie('name', '八戒', max_age=10) return resp # 删除 @cookie.route('/del/') def del_cookie(): resp = make_response('cookie已删除') # 删除cookie,其实是设置cookie立即失效 resp.delete_cookie('name') return resp
session
-
说明:
session是一种比cookie更加安全的携带信息的方案,功能与cookie相同。
-
分类:
- server side session:数据存放在服务器上,客户端保存的是seesion_id(通过cookie传输)
- client side session:将session数据加密编码,然后保存到客户端,flask默认采用的就是这种方案
-
使用:
from flask import Blueprint, session sess = Blueprint('sess', __name__, url_prefix='/session') # 获取 @sess.route('/get/') def get_session(): return session.get('name', 'who are you?') # 设置 @sess.route('/set/') def set_session(): # 设置有效期,默认浏览器关闭即失效 # 设置为True,session有效期为永久 # 永久的时间由PERMANENT_SESSION_LIFETIME配置选项决定,默认31天 session.permanent = True session['name'] = 'cuihua' return 'session已设置' # 删除 @sess.route('/del/') def del_session(): # 删除指定的session,第二个参数设置为None,session不存在也不报错 # session.pop('name', None) # 清空session session.clear() return 'session已删除'
flask-session
-
说明:将session数据保存到服务器的解决方案。
-
安装:
pip install flask-session
-
使用:
from flask import Flask, session from flask_script import Manager from redis import Redis from flask_session import Session app = Flask(name) app.config['SECRET_KEY'] = '123456' app.config['SESSION_TYPE'] = 'redis' app.config['SESSION_REDIS'] = Redis() manager = Manager(app) sess = Session(app) # 可以通过两步进行初始化 # sess.init_app(app) @app.route('/') def index(): return 'flask-session' @app.route('/get/') def get_session(): return session.get('name', '你是谁?') @app.route('/set/') def set_session(): session['name'] = 'houge' return 'session已设置' if __name__ == '__main__': manager.run()
模板引擎
-
说明:
模板文件就是安装特定的语法规则书写的负责展示效果的HTML文件;模板引擎就是提供这种特定规则替换和解析的工具。
-
Jinja2:
在flask中采用的时Jinja2的模板引擎,它是由flask核心开发组人员开发的。
Jinja2语法
-
目录结构
project/ # 工程目录 manage.py # 启动控制文件 templates/ # 模板文件目录
-
模板渲染
- 在
templates
目录下创建一个模板文件index.html
,在其中写入页面内容 - 在视图函数中渲染模板:
render_template('index.html')
- 渲染模板字符串:
render_template_string('<h1>渲染模板字符串</h1>')
- 设置模板文件自动加载:
app.config['TEMPLATES_AUTO_RELOAD'] = True
,调试模式会自动加载
- 在
-
使用变量
- 需要解析的变量需要放在
{{ }}
中 - 渲染模板文件时需要传递相关变量:
render_template('var.html', name='goudan')
- 注释写在
{# #}
中
- 需要解析的变量需要放在
-
使用过滤器
- 说明:过滤器就是对要解析的变量进行特定的处理,然后再输出。
- 使用:
{{ 变量|过滤器 }}
,如:{{ name|upper }}
,就是将name转换为全大写输出 - 常用过滤器:
过滤器 说明 upper 全大写 lower 全小写 title 每个单词首字母大写 capitalize 首字母大写 trim 去掉两边的空白 striptags 过滤HTML标签 safe 渲染时不转义(默认全部转义),只能使用在信任的变量渲染 - 动态开启关闭渲染转义
{# 动态开启关闭转义 #} {% autoescape False %} <div>{{ user }}</div> {% endautoescape %}
-
流程控制
{% if name %} <h1>Hello {{ name }}!</h1> {% else %} <h1>Hello World!</h1> {% endif %} <ol> {% for i in range(5) %} <li>{{ i }}</li> {% endfor %} </ol>
-
文件包含
-
说明:
当有多处相同的显示效果出现时,将内容单独提取出来,需要的地方直接包含进来即可。包含另一个文件,相当将其中的内容直接粘贴过来,避免了大量重复书写(复制粘贴)
-
使用:
{% include 'include2.html' %}
-
-
宏的使用
- 定义宏:
{% macro 宏名(参数) %}宏内容{% endmacro %}
- 调用宏:
{{ 宏名(参数) }}
- 导入宏:
{% from '宏所在文件' import 宏名 %}
- 说明:宏采用了类似于python中的函数进行定义和调用,可以减少代码的重复书写,而且比较灵活。
- 定义宏:
-
模板继承
-
说明:当一个网站的多个页面都很相似,只有细微的差别,可以通过模板继承减少重复书写。
-
使用:
parents.html
<html> <head> <meta charset="UTF-8"> <title>{% block title %}基础模板标题{% endblock %}</title> </head> <body> {% block body %}<div>默认内容</div>{% endblock %} </body> </html>
children.html
{# 继承自另一个模板 #} {% extends 'parents.html' %} {# 根据block可以修改原有的block内容 #} {% block title %}子模板标题{% endblock %} {% block body %} {# 保留基础模板中的内容 #} {{ super() }} <div>新加的内容</div> {% endblock %}
-
提醒:若在子模板重写了一个block,原来的显示效果全丢了,八成的原因是忘记书写
{{ super() }}
-