Flask Sessions(会话)
与Cookie不同,Session(会话)数据存储在服务器上。会话是客户端登录到服务器并注销服务器的时间间隔。需要在该会话中保存的数据会存储在服务器上的临时目录中。
为每个客户端的会话分配会话ID。会话数据存储在cookie的顶部,服务器以加密方式对其进行签名。对于此加密,Flask应用程序需要一个定义的SECRET_KEY。
Session对象也是一个字典对象,包含会话变量和关联值的键值对。
主文件中的文件配置以下session参数
注:主文件指创建Flask类实例的文件:
from flask import Flask
app = Flask(__name__, static_folder='static')
配置 Flask secret_key
这里可以使用os.urandom(32)来生成一个32位的随机字符串;
或使用linux的方式,例如:openssl rand -base64 32,运行后会生成一个随机的32位base64编码,更多方式见以下链接:
linux下生成高强度密码的四大神器
八种在 Linux 上生成随机密码的方法
app.secret_key = 'CSaSvOU6h1iMb15s+GsV5TuKYSbREcBZ/g1Gjh9nCec='
设置session的过期时间
若是需要设置成每次访问都必须登录,则可以将'PERMANENT_SESSION_LIFETIME'设置得非常短,比如1(1秒)。
app.config['PERMANENT_SESSION_LIFETIME'] = 1
若需要设置更长时间,比如7天有效,请参考:Flask中的session操作
关于session的参数还有很多,这里不做过多记录。
view.py中,配置路由和函数
导包、模块、配置
# -*- coding: utf-8 -*-
from flask import render_template, request, flash, url_for, redirect, session
from webapp import app
from webapp.conf.conf import name, pwd
将name/pwd存储在别的文件中,在头部导入。
首页路由
@app.route('/', methods=['GET'])
def index():
if 'username' in session and session['username'] == name:
return render_template('base.html')
return redirect(url_for('login'))
index路由:
在index函数中设置判断,默认GET直接返回redirect到login去。
如果session中有username,并且username == name,认为已经登录,返回渲染首页模板。
@app.route('/login/', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
form = request.form
username = form.get('email')
password = form.get('password')
session['username'] = username
if username == name and password == pwd:
return redirect(url_for('index'))
else:
error = '用户名/密码错误!'
flash(error)
return redirect(url_for('login'))
else:
return render_template("login.html", error=error)
login页面路由:
设置methods=[‘GET’, ‘POST’],因为有post提交表单(username,password)。
login函数中默认返回渲染login模板,携带error信息,初始是没有error信息的。
前端点击登录按钮,向后端提交POST,
函数接收到判断method == 'POST‘后,读取表单信息(这里使用email和password登录),分别获得username和password,然后设置session[‘username’] = username,再进行username/password判断是否与配置文件中相等,相等的话,登录成功,返回redirect到index去;不相等的话,设置error为’用户名/密码错误!‘,flash error,返回redirect到login,此时刷新login页面,将flash message信息显示在页面上。
@app.route('/logout/', methods=['GET'])
def logout():
# session.pop('username', None)
session.clear()
return redirect(url_for('login'))
logout路由:
前端页面点击logout按钮后,由于我们使用session[‘username’]进行判断是否需要登录,使用session.pop(‘username’, None)或session.clear()清除session信息,然后redirect到login去,即完成了logout。
这个是login模板中,flash message部分的代码块,由于if控制,无flash message时页面不显示这部分代码块。
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class=flashing>
{% for message in messages %}
<div class="alert alert-danger alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
{{ message }}
</div>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
以上。

本文介绍了如何在Flask框架中利用session进行用户登录访问控制。通过设置SECRET_KEY确保会话安全,调整session过期时间以控制用户登录状态。在view.py中配置路由与函数,包括首页、登录、登出路由,实现了用户登录验证、session存储及登出功能。
443

被折叠的 条评论
为什么被折叠?



