flask使用操作指南之session实现登录验证

Auth: 王海飞

Data:2018-07-24

Email:779598160@qq.com

github:https://github.com/coco369/knowledge

第一种方式: flask默认的session/cookie使用方式

将session中的数据存储在cookie中,并返回给客户端。

缺点:数据存储在cookie中,不安全

1. 前端login.html页面

登录页面就两个输入框,分别接收用户名和密码

  <dd class="user_icon">
   <input type="text" name="username" placeholder="账号" class="login_txtbx"/>
  </dd>
  <dd class="pwd_icon">
   <input type="password" name="password" placeholder="密码" class="login_txtbx"/>
  </dd>

2. 后端方法

@blue.route('login/', methods=['GET'])
def login():
    if request.method == 'GET':
        # 获取提交的用户名和密码
        username = request.args.get('username')
        password = request.args.get('password')
        # 模拟判断用户名和密码
        if username == '小明' and password == '123456':
            # 启动permanent修改为True
            session.permanent = True
            # 在session中记录登录状态
            session['login_status'] = 1
            return '登录成功'
        else:
            return '登录失败'

3. 修改启动manage.py文件中定义加密以及过期时间

# session加密方式
app.secret_key = '123'

# 设置过期时间,5秒后session失效
app.permanent_session_lifetime = 5

注意:

1)设置一个持久化会话的存活时间,必须修改session.permanent的属性和flask对象app的permanent_session_lifetime属性,permanent_session_lifetime属性作为datetime.timedelta对象,从Flask0.8开始也可以用一个整数表示多少秒后过期。

2)加密的强度取决于SECRET_KEY的复杂程度。一般SECRET_KEY可以通过os.urandom(24)随机生成。

第二种方式: 使用flask_session扩展库实现登录功能描述

使用session实现用户的模拟登陆功能。在前面已经说过了,在用户第一次访问服务端的时候,在服务端的redis中会创建一个session值,在客户端浏览器的cookies中也会创建一个session的值。该cookies中的session值和redis中的session值是一样的,那么在往后的访问操作中,请求request都会传递给后端,后端在获取到request的时候,其实就是获取到了request.cookies中的session的值了,那么就可以做登录的校验了。校验功能如下:

素材地址

1. 前端login.html页面

登录页面就两个输入框,分别接收用户名和密码

  <dd class="user_icon">
   <input type="text" name="username" placeholder="账号" class="login_txtbx"/>
  </dd>
  <dd class="pwd_icon">
   <input type="password" name="password" placeholder="密码" class="login_txtbx"/>
  </dd>

2. 后端方法

模拟用户的登录,直接判断用户的名称为妲己以及密码为123123.如果验证成功,就向session中保存用户的id值。如果没有登录成功的话,那就对session不做任何的处理,直接跳转到登录页面上去。

@app_blue.route('/new_login/', methods=['GET', 'POST'])
def new_login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        username = request.form.get('username')
        password = request.form.get('password')
        # 数据库校验,用户密码是否正确
        if username == '妲己' and password == '123123':
            session['user_id'] = 1
            return redirect((url_for('first.index')))
        else:
            return redirect(url_for('first.new_login'))


@app_blue.route('/index/', methods=['GET'])
def index():
    return render_template('index.html')

3. 修改启动manage.py文件中定义加密以及过期时间

# 配置session
from flask_session import Session	

# 指定redis作为缓存数据库
app.config['SESSION_TYPE'] = 'redis'
# 指定访问哪一个redis,ip和端口
app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port=6379)

# 初始化app
se = Session()
se.init_app(app=app)

装饰器

使用装饰器去装饰我们的index()函数,如果用户登录了,则session中有user_id的key,如果没有登录的话,session中是没有user_id的key的。那么验证用户是否登录了,其实就是验证session的user_id

def is_login(func):
    @wraps(func)
    def check_login(*args, **kwargs):
        if 'user_id' in session:
            return func(*args, **kwargs)
        else:
            return redirect(url_for('first.new_login'))
    return check_login

修改index()函数,使用装饰器装饰

@app_blue.route('/index/', methods=['GET'])
@is_login
def index():
    return render_template('index.html')

书籍推荐