Python轻量级Web框架Flask(4)——Flask会话技术和Flask模板语言
1、客户端会话技术:
会话:服务器端和客户端之间的交互
一个服务器可以被多个浏览器访问,他们之间是通过http协议来完成访问的(1、先请求,后响应;2、响应后会断开连接;3、一次请求就结束了),cookie的作用就是让服务器能够认识浏览器,常用于登录。
cookie 本身由浏览器保存,通过response将cookie写到浏览器上,下一次访问,浏览器会根据不同的规则携带cookie过来。
cookie 工作原理(以登录为例说明):1.浏览器登录,2.服务器验证用户名和密码(通过之后返回cookie给浏览器),3.浏览器自动保存cookie到本地,4.下一次浏览器请求登录该服务器会在请求的同时自动携带浏览器的cookie,5.服务器会取出cookie值,判断是哪个用户在访问,返回对应的用户数据给浏览器,如下图 1 所示。
cookie :是通过服务器创建Response来创建的,它的作用就是能够让服务器在一段时间内记住访问过服务器的客户端。
cookie操作:
- 设置cookie:response.set_cookie(key,value[,max_age=None,expries=None]);max_age:整数,指定cookie过期时间; expries:整数,指定过期时间,可以是一个具体日期;max_age和expries两个选一个指定就好。
- 获取cookie:request.cookies.get(key);
- 删除cookie:response.delete_cookie(key)
- 注意:没有修改cookie这种说法
练习:以登录过程为例子(如上图 1 ),用Flask实现用户登录,用户注销的功能模拟
1、项目框架(从上一个文章项目中复制的框架参考连接)
2、home.html代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body><h2>首页</h2><hr>
{# 不要进行前端的页面跳转,要带着数据跳转要经过后端#}
{# 下面用到的是jinja2模板语言,需要在setting中设置#}{% if username %}<p>当前登录用户:{{ username }}<a href="/logout/">注销</a></p>{% else %}<a href="/login/">登录</a>{% endif %}</body>
</html>
3、login.html代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录</title>
</head>
<body><h2>登录</h2><hr>
{# <form action=""method="post">#}
{# <form action="{{ url_for('user.login') }}" method="post"></form> #}<form action="/login/" method="post"><p>用户名:<input type="text" name="username"></p><p>密码:<input type="password" name="password"></p><p><button>提交</button></p></form>
</body>
</html>
4、__init__代码:
# __init__.py : 初始化文件,创建Flask应用
from flask import Flask
from .views import bluedef creat_app():app = Flask(__name__)# 注册蓝图app.register_blueprint(blueprint=blue)return app
5、models代码:
# models.py : 模型,数据库
6、views代码
# 在views.py中放路由和视图函数
import datetimefrom flask import Blueprint, render_template, request, redirect
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件# 蓝图
blue = Blueprint('user', __name__)# 首页(一个页面可以由多个路由,也就是说可以有多个装饰器)
@blue.route('/')
@blue.route('/home/')
def home():# 4. 获取cookieusername = request.cookies.get('user')return render_template('home.html', username=username)@blue.route('/login/',methods = ['GET','POST'])
def login():# GET:访问登陆页面if request.method == 'GET':return render_template('login.html')elif request.method == 'POST':pass# 1. 获取前端提交过来的数据username = request.form.get('username') # 写在括号里的username要和前端一致password = request.form.get('password') # 写在括号里的password要和前端一致# 2. 模拟登录:用户名和密码验证if username == 'zhangsan' and password == '321':# 登陆成功response = redirect('/home/')# 3. 设置cookie# cookie不能用中文# response.set_cookie('user',username) # 默认浏览器关闭则cookie失效# 过期时间:max_age: 秒# response.set_cookie('user',username,max_age=3600 * 24 * 4)response.set_cookie('user',username,expires=datetime.datetime(2023,5,10))return response# 注销
@blue.route('/logout/')
def logout():response = redirect('/home/')# 5. 删除cookieresponse.delete_cookie('user')return response
7、app代码
from App import creat_appapp = creat_app()if __name__ == '__main__':app.run(debug=True)
总结:上面的框架只是对cookie最直接的演示和说明
2、Flask会话技术Session代码实现:
- session是服务器端会话技术,依赖于cookie
- 特点:
- 服务端的会话技术
- 所有数据存储在服务器中
- 默认存储在内存中
- 存储结构是key-value形式,键值对
- session离不开cookie
- 练习:以登录过程为例子(如上图 1 ),用Flask实现用户登录,用户注销的功能模拟
1、项目框架同上面cookie讲解练习(从上一个文章项目中复制的框架参考连接)
2、改动的__init__代码
# __init__.py : 初始化文件,创建Flask应用
from flask import Flask
from .views import blue
import datetimedef creat_app():app = Flask(__name__)# 注册蓝图app.register_blueprint(blueprint=blue)# session配置print(app.config) # Flask的配置信息'''<Config {'ENV': 'production', 'DEBUG': False, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'SECRET_KEY': None, 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(days=31), 'USE_X_SENDFILE': False, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': None, 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': None, 'JSON_SORT_KEYS': None, 'JSONIFY_PRETTYPRINT_REGULAR': None, 'JSONIFY_MIMETYPE': None, 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093}>'''# 这里SECRET_KEY可以自己设置,它的作用就就是对照解析session中对应的value加密值app.config['SECRET_KEY'] = 'abcdef123'# 设置session的存在时间app.config['PERMANENT_SESSION_LIFETIME'] = datetime.timedelta(days=20)return app
2、改动的views代码
# 在views.py中放路由和视图函数
import datetimefrom flask import Blueprint, render_template, request, redirect, session
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件# 蓝图
blue = Blueprint('user', __name__)# 首页(一个页面可以由多个路由,也就是说可以有多个装饰器)
@blue.route('/')
@blue.route('/home/')
def home():# 4. 获取sessionusername = session.get('user')return render_template('home.html', username=username)@blue.route('/login/',methods = ['GET','POST'])
def login():# GET:访问登陆页面if request.method == 'GET':return render_template('login.html')elif request.method == 'POST':pass# 1. 获取前端提交过来的数据username = request.form.get('username') # 写在括号里的username要和前端一致password = request.form.get('password') # 写在括号里的password要和前端一致# 2. 模拟登录:用户名和密码验证if username == 'zhangsan' and password == '321':# 登陆成功response = redirect('/home/')# 3. 设置sessionsession['user'] = usernamesession.permanent = True # 有这条语句,session的存在时间才能显示出来(expires)return response# 注销
@blue.route('/logout/')
def logout():response = redirect('/home/')# 5. 删除sessionsession.pop('user')# session.clear() # 慎用,会删除服务器下所有sessionreturn response
3、Flask模板语言Template基本语法:
- MVT中的V代表视图函数,视图函数的作用是数据和界面之间的逻辑调度。
- 模板是MVT当中的T,是呈现给用户的界面,一个V可以调用任意个T,一个T可以被任意个V调用。
- 模板处理分为两个过程:1、加载HTML,2、模板渲染(因为有模板语言,才能够将后端的数据渲染到界面中)
- 模板代码包含两个部分:1、静态HTML,2、动态插入的代码段(模板语法)
- 在pycharm(专业版)中书写模板语言,要在setting中进行设置,把模板语言选为jinja2
- Jinja2介绍:
- Flask中使用jinja2模板引擎,它是由Flask作者开发的一个现代化设计和友好的python模板语言,模仿了Django的模板引擎,优点是:速度快、HTML设计和后端python分离、减少了python复杂度、灵活、安全、提供了控制、继承等高级功能。
- 模板语法:
- 模板语法中的标签说明
- 过滤器:将变量通过一层层的功能进行修改(一般这里所说的变量是字符串),过滤器很多,用到了就积累下来。
- 实例说明:通过python项目实例来演示上面的相关功能
1、项目框架概览
2、base.css和base.js和models代码为空
3、base.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>父模板</title>{# 通用css文件 #}<link rel="stylesheet" href="{{ url_for('static', filename='css/base.css') }}">{% block extcss %}{% endblock %}
</head>
<body>{% block head %}{% endblock %}<hr>{% block content %}{% endblock %}<hr>{% block foot %}{% endblock %}<hr>{# 通用的js文件 #}<script src="{{ url_for('static', filename='js/base.js') }}"></script>{% block extjs %}{% endblock %}
</body>
</html>
4、child1.html
{% extends 'base.html' %}{# 继承base #}
{% block head %}<p>child1YYDS</p>
{% endblock %}
5、child2.html
{# 继承child1#}
{% extends 'child1.html' %}{# super() #}
{% block head %}{# 如果想要保留child1中的内容,就要调用super函数 #}{{ super() }}<p>child2YYDS</p>
{% endblock %}{# include:嵌入 #}
{% block content %}<p>child2 content</p>{% include 'child2_include.html' %}
{% endblock %}{# 宏定义:相当于python函数 #}
{% macro person(name, age) %}<b>姓名:{{ name }};年龄:{{ age }}</b>
{% endmacro %}{% block foot %}{{ person('鸡', 23) }}{# 过滤器 #}<p>{{ name | capitalize }}</p>
{% endblock %}
6、child2_include.html
<div>这是child2中通过include嵌套的内容,它写在child2_include.html中</div>
7、home.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>home</title>
</head>
<body><h2>Home</h2><hr>{# 模板语言的注释:ctrl + / #}<h4>变量:</h4><p>name:{{ name }}</p><p>num:{{ num }}</p><p>hobby:{{ hobby }}</p><hr><h4>标签:</h4><h5>if语句</h5>{% if num <= 3 %}<p>{{ name }} 排名前三</p>{% elif (num > 3) and (num <= 5) %}<p>{{ name }} 排名靠前</p>{% else %}<p>{{ name }} 排名靠后</p>{% endif %}<hr><h5>for循环</h5>{% for ho in hobby %}{% if loop.first %}<p style="color: red;">{{ ho }}</p>{% else %}<p style="color: blue;">{{ ho }}</p>{% endif %}index:{{ loop.index }}index0:{{ loop.index0 }}reindex0:{{ loop.revindex0 }}reindex:{{ loop.revindex }}{% else %}{# for循环的else只有在for循环无法执行时才会执行 #}<p>for循环的else</p>{% endfor %}</body>
</html>
8、 __ init__
# __init__.py : 初始化文件,创建Flask应用
from flask import Flask
from .views import bluedef creat_app():app = Flask(__name__)# 注册蓝图app.register_blueprint(blueprint=blue)return app
9、views
# 在views.py中放路由和视图函数from flask import Blueprint, render_template
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件# 蓝图
blue = Blueprint('user', __name__)@blue.route('/')
def home():passdata = {'name': 'dingding','hobby': ['eating', 'sleep', 'dance'],'num': 15}# return render_template('home.html', **data)# return render_template('base.html')# return render_template('child1.html')return render_template('child2.html',**data)
10、 app
from App import creat_appapp = creat_app()if __name__ == '__main__':app.run(debug=True)
Python轻量级Web框架Flask(4)——Flask会话技术和Flask模板语言相关推荐
- Python轻量级Web框架Flask(5)——Flask模型基础和数据迁移
0.前言:学习这部分的前提是对python的面向对象有一定的了解,同时对MySQL有扎实的学习 1.Flask模型基础知识: Flask模型 ORM (注意:在flask中用ORM可以实现SQL语句功 ...
- Python轻量级WEB框架web.py之操作数据库
以MYSQL做示例: pip install pymysql 如果安装超时或其他原因不成功,选择下面的站点来安装 pip install -i https://pypi.douban.com/simp ...
- Python轻量级WEB框架web.py,模板使用
首先是安装web.py,方法有几种,如下 pip install web.py==0.40 easy_install web.py 或者是下载http://webpy.org/install.zh-c ...
- Python轻量级Web框架:Bottle库
Bottle是一个超轻量级的python库.说是库,其本身只由一个4000行左右的文件构成,并且不需要任何依赖,只靠python标准库即可运作. 和它本身的轻便一样,Bottle库的使用也十分简单.相 ...
- Python明星web框架Flask
Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug和模 ...
- python主流web框架识别
想学习web框架,又想熟悉python,问题来了,有没有极简的数据来支撑快速开发,特来研究 不能去研究几十个,没时间,研究主流的即可 Django.Tornado.Flask.Twisted. 所谓网 ...
- 【python轻量级中台框架开发第一层】 ORM flask-sqlacodegen
@[python](python轻量级中台框架开发第一层 ORM flask-sqlacodegen) 欢迎阅读,点评指正 任何系统或框架都离不开数据存储.所以任何的开始都是要保存下我们需要的东西. ...
- python bottle web框架简介
Bottle 是一个快速,简单,轻量级的 Python WSGI Web 框架.单一文件,只依赖 Python 标准库 .bottle很适合会一点python基础的人使用,因为这框架用起来很简单,只要 ...
- python搭建django框架,Python之Web框架Django项目搭建全过程
Python之Web框架Django项目搭建全过程 IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 注:可通过pip fre ...
最新文章
- MySQL ERROR 1878 解决办法
- History(历史)命令用法
- eclipse的安装使用
- 台式无线网卡管理服务器,台式电脑设置wifi上网
- 第三次学JAVA再学不好就吃翔(part17)--数组
- SAP JAM的回收站
- ​选择云服务器的小窍门
- PyCharm使用期间出现报错集合 持续更新ing
- java web fileupload_javaweb 文件上传(fileupload) 下载
- 习题4-6 水仙花数(20 分)
- 某知名系统漏洞挖掘与利用思路探索
- 2021新版CISSP考试大纲解析
- 程序员如何用优秀免费软件替代盗版软件/流氓软件
- 华为确认53岁高管丁耘骤逝:执掌最大营收业务,东南大学毕业,在职已超26年...
- Java TCP发送与接收
- Sharding-JDBC 基础
- Vue-change和input事件
- 【OJ每日一练】1114 - 坐大巴
- 团队与协作的一些思考
- 新超重车辆高速动态称重系统设计方案
热门文章
- PSP金手指下载及使用方法和图文教程(图文)
- 那些年追过的开源GNSS软件接收机(二)
- NVIDIA Jetson TX1(4)
- Codeforces Round #782 (Div. 2) A-D题解
- 基于高德地图的APP路径规划开发
- 文创设计结论_2019上海国际高中艺术offer大盘点!设计界哈佛罗德岛的offer都给了谁?...
- JAVA商城项目(微服务框架)——第7天nginx+cors解决跨域+品牌+分类查询
- 职场聚焦,现在年轻人的成功标准是什么?
- Spring Cloud OAuth2 认证服务器
- linux查看psd文件,PSD 文件扩展名: 它是什么以及如何打开它?