Auth: 王海飞
Data:2018-07-24
Email:[email protected]
将session中的数据存储在cookie中,并返回给客户端。
缺点:数据存储在cookie中,不安全
登录页面就两个输入框,分别接收用户名和密码
<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>
@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 '登录失败'
# 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)随机生成。
使用session实现用户的模拟登陆功能。在前面已经说过了,在用户第一次访问服务端的时候,在服务端的redis中会创建一个session值,在客户端浏览器的cookies中也会创建一个session的值。该cookies中的session值和redis中的session值是一样的,那么在往后的访问操作中,请求request都会传递给后端,后端在获取到request的时候,其实就是获取到了request.cookies中的session的值了,那么就可以做登录的校验了。校验功能如下:
登录页面就两个输入框,分别接收用户名和密码
<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>
模拟用户的登录,直接判断用户的名称为妲己以及密码为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')
# 配置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
@app_blue.route('/index/', methods=['GET'])
@is_login
def index():
return render_template('index.html')