Flask--使用session进行简易的用户登录访问控制

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

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">&times</button>
					{{ message }}
			</div>
		{% endfor %}
		</ul>
	{% endif %}
{% endwith %}

以上。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值