客户端的会话技术。
cookie本身由浏览器保存,通过Response将cookie写到浏览器上,下一次访问,浏览器会根据不同的规则携带cookie过来
1.1 特点
-
客户端会话技术,浏览器的会话技术
-
数据全都是存储在客户端中
-
存储使用的键值对结构进行的存储
-
特性
-
支持过期时间
-
默认会自动携带本网站的所有cookie
-
根据域名进行cookie存储
-
不能跨域名
-
不能跨浏览器
-
cookie是通过服务器创建的Response来创建的
response.set_cookie(key,value[,max_age=None,exprise=None])
-
max_age
:整数,指定cookie过期时间整数, -
expries
:指定过期时间,可以指定一个具体日期时间 -
max_age
和expries
两个选一个指定
request.cookies.get(key)
request.delete_cookie(key)
1.5 案例
一个通过cookie来实现登录的例子
首页模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>首页</h1>
<hr>
{% if username %}
当前登录人:{{ username }}
<a href="/logout/">注销</a>
{% else %}
<a href="/login/">登录</a>
{% endif %}
</body>
</html>
登录模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<hr>
{#<form action="" method='post'>#}
{#<form action="/login/" method='post'>#}
<form action="{{url_for('user.login')}}" method='post'>
<p>
用户名:<input type="text" name="username">
</p>
<p>
密码:<input type="password" name="password">
</p>
<p>
<button>登录</button>
</p>
</form>
</body>
</html>
后端代码
# 路由+ 视图函数
"""
在这里需要一个app,但是再次通过执行
from App import create_app
app = create_app()
来引入app就变得不太美好,这里使用flask的蓝图来解决
"""
import datetime
from flask import Blueprint, render_template, request, redirect
# 蓝图,蓝图可以有多个,可以根据不同的蓝图,管理不同的模块,然后不同模块使用不同的路由
blue = Blueprint('user', __name__)
# 这里的路由就是blue开头
@blue.route('/')
@blue.route('/home/')
def home():
# 获取cookie
username = request.cookies.get('user')
return render_template('home.html', username=username)
@blue.route('/login/', methods=['GET', 'POST'])
def login():
# 1. get 访问登录页面
if request.method == 'GET':
return render_template('login.html')
elif request.method == 'POST':
# 2. 丛前端得到提交的数据
username = request.form.get('username')
password = request.form.get('password')
# 3. 模拟登录
if username == 'python' and password == '123':
# 重定向到home页面
resp = redirect('/home/')
# 设置cookie
# cookie不能是中文
# resp.set_cookie('user',username ) # 默认关闭浏览器就失效
# 过期时间
resp.set_cookie('user', username, expires=datetime.datetime(2023, 12, 10))
return resp
else:
return '用户名或密码错误'
#注销
@blue.route('/logout/')
def logout():
resp = redirect('/home')
# 4. 删除cookie
resp.delete_cookie('user')
return resp
运行情况

登录成功后,可以在浏览器中看到cookie中的信息

二、session
服务器端会话技术,依赖于cookie
2.1 特点
-
服务端的会话技术
-
所有数据存储在服务器中
-
默认存储在内存中
-
存储结构也是key-value形势,键值对
-
session 是离不开cookie的
Flask中的session是全局对象(之前的request也是Flask的一个全局对象)
2.2 设置session
session['key'] ='value
2.3 获取session
session.get(key,default=None) #根据键获取会话的值
2.4 删除session
session.pop(key) #删除某一值
session.clear()#清除所有
2.5 案例
首页模板和登录模板不变,修改后端代码如下
后端代码
# 路由+ 视图函数
"""
在这里需要一个app,但是再次通过执行
from App import create_app
app = create_app()
来引入app就变得不太美好,这里使用flask的蓝图来解决
"""
import datetime
from flask import Blueprint, render_template, request, redirect, session
# 蓝图,蓝图可以有多个,可以根据不同的蓝图,管理不同的模块,然后不同模块使用不同的路由
blue = Blueprint('user', __name__)
# 这里的路由就是blue开头
@blue.route('/')
@blue.route('/home/')
def home():
# 获取session
username = session.get('user')
return render_template('home.html', username=username)
@blue.route('/login/', methods=['GET', 'POST'])
def login():
# 1. get 访问登录页面
if request.method == 'GET':
return render_template('login.html')
elif request.method == 'POST':
# 2. 丛前端得到提交的数据
username = request.form.get('username')
password = request.form.get('password')
# 3. 模拟登录
if username == 'python' and password == '123':
# 重定向到home页面
resp = redirect('/home/')
# 设置session
session['user'] = username
return resp
else:
return '用户名或密码错误'
# 注销
@blue.route('/logout/')
def logout():
resp = redirect('/home')
# 删除session
session.pop('user')
return resp
需要配置下flask的配置
def create_app():
app = Flask(__name__)
# 注册蓝图
app.register_blueprint(blueprint=blue)
# 启动session时需要设置
app.config['SECRET_KEY'] = 'DFSDFDSFDS'
return app
关于Flask的配置
可以通过Flask的app.config得到当前的配置
<Config {
'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',
'TEMPLATES_AUTO_RELOAD': None,
'MAX_COOKIE_SIZE': 4093
}>
原文始发于微信公众号(Python之家):Flask-6-会话技术
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/198312.html