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() }}
Flask—02-Flask会话控制与模板引擎的更多相关文章
- Flask从入门到精通之Jinja2模板引擎
我们使用一个简单的例子切入到Jinja2模板引擎,形式最简单的Jinja2模板引擎就是一个包含响应文本的文件,实例如下: <h1>Hello World!</h1> 最简单的包 ...
- 02 flask 请求钩子、异常捕获、上下文、Flask-Script 扩展、jinja2 模板引擎、csrf防范
一 请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个 ...
- Flask之项目创建,路由以及会话控制
Flask Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架. Flask 本身相当于一个内核,其他几乎 ...
- 【 Python】模块学习之Flask模板引擎:jinja2
原文链接:https://www.cnblogs.com/dachenzi/p/8242713.html 模板的概念 要了解jinja2,那么需要先理解模板的概念.模板在Python的web开发中广泛 ...
- Python Flask Jinja2模板引擎
模板 简介 模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请 求的上下文中才能知道. 渲染 使用真实值替换变量,再返回最终得到的响应字符串,这一过程 称为渲染.为了渲染模 ...
- flask框架下的jinja2模板引擎(1)(模板渲染)
#转载请留言联系 模板是什么? 在 flask 框架中,视图函数有两个作用:处理业务逻辑和返回响应内容.在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本.模板作用即是承担视图函 ...
- day94:flask:Jinjia2模板引擎&flask中的CSRF攻击&Flask-SQLAlchemy的创建模型类和基本的增删改查
目录 1.Jinjia2模板引擎 1.Jinjia2加载模板并传递数据到模板中 2.Jinjia2的模板语句 3.模板中特有的变量和函数 4.模板中内置的过滤器 5.自定义过滤器 6.模板继承 2.在 ...
- Flask 框架下 Jinja2 模板引擎高层 API 类——Environment
Environment 类版本: 本文所描述的 Environment 类对应于 Jinja2-2.7 版本. Environment 类功能: Environment 是 Jinja2 中的一个 ...
- flask的模板引擎jinja入门教程 包含一个通过网络实时传输Video视频流的示例
本文首发于个人博客https://kezunlin.me/post/1e37a6/,欢迎阅读最新内容! tutorial to use python flask jinja templates and ...
随机推荐
- Git使用教程,感觉比较全,所以【转载】
一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...
- ADO.NET教程(1)初识ado.net
ADO.NET简介 ADO.NET使用到的类 需掌握的方法和属性 ado.net连接实例 ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于在以往的 ...
- ireport 导出excel 分页 和 文本转数字格式的解决方法
景:ireport 画excel 报表,导出时要求 数据分页,每页包含 标题和页脚 1.画excel 2.处理分页 首先建立一个变量totalNum 用于记录总共有多少条记录,注意设置属性为Integ ...
- css3 转换 过渡 及动画
转换transform: 通过 CSS3 转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸.您可以使用 2D 或 3D 转换来转换您的元素 2D转换属性: transform 向元素应用 2D 或 ...
- 转:什么是4D(DRG、DLG、DOM、DEM)数据?
ps:摘抄地址http://blog.163.com/wangqing_rs/blog/static/16451519120111026102916472/ 什么是4D(DRG.DLG.DOM.DE ...
- 使用 profile 进行python代码性能分析
定位程序性能瓶颈 对代码优化的前提是需要了解性能瓶颈在什么地方,程序运行的主要时间是消耗在哪里,对于比较复杂的代码可以借助一些工具来定位,python 内置了丰富的性能分析工具,如 profile,c ...
- matlab练习程序(Arnold图像置乱)
自从上次写了Hilbert图像置乱之后,就对图像置乱研究了一下,发现这里面也是有很多置乱算法的. Arnold也算一种比较主要的置乱算法,算法由以下变换公式产生: 这里a和b是参数,n是迭代次数,N是 ...
- c#利用三层架构做一个简单的登录窗体
就个人而言,三层架构有点难理解,不知道该如何下手,各层与各层之间怎么调用 最近一直在研究三层架构,经过网上学习与多方打听写一下自己的心得.有不足之处,可以评论和私聊探讨 言归正传: 三层架构(3-ti ...
- Selenium2学习(十七)-- js处理日历控件(修改readonly属性)
前言 日历控件是web网站上经常会遇到的一个场景,有些输入框是可以直接输入日期的,有些不能,以我们经常抢票的12306网站为例,详细讲解如何解决日历控件为readonly属性的问题. 基本思路:先用j ...
- 为我们的SSR程序添加热更新功能
前沿 通过上一篇文章 通过vue-cli3构建一个SSR应用程序 我们知道了什么是SSR,以及如何通过vue-cli3构建一个SSR应用程序.但是最后遗留了一些问题没有处理,就是没有添加开发时的热更新 ...