登录注册系统非常简单,在之前的文章中也提到过。
由于HTTP协议是一种无状态协议,而服务器要跟踪用户状态,就只能通过cookie实现。大多数Web框架提供了Session功能来封装保存用户状态的cookie。
使用Session:
优点是简单易用,可以直接从Session中取出用户登录信息。
缺点是服务器需要在内存中维护一个映射表来存储用户登录信息,如果有两台以上服务器,就需要对Session做集群,因此,使用Session的Web App很难扩展。、
使用Cookie:
优点是可配置的过期时间、易扩展、数据持久等。
缺点是是大小受到限制、潜在的安全风险。
Flask提供的session做登录分分钟的事情,使用原始cookie登录,稍微麻烦一点,主要是加密解密过程,防止伪造,实现防伪造cookie的关键是通过一个单向算法(例如MD5),demo repository简化了这一过程。
1. 需要登录页地址如果没有登录返回登录页
if request.cookies.get("username"):
return render_template("index.html")
else:
return """<form action="%s" method='post'>
<input type="text" name="username" required>
<input type="password" name="password" required>
<input type="submit" value="登录">
</form>""" %url_for("login")
2.提交表单到登录验证(默认admin、admin),验证成功(设定cookie key:value)返回登录成功信息
username = request.form.get("username")
password = request.form.get("password")
if username == "admin" and password == "admin":
app.logger.info(url_for('index'))
resp = make_response(redirect(url_for("index")))
resp.set_cookie(key='username', value=username, expires=None)
resp.set_cookie(key='sessionId', value=md5(username + password + SecretKey), expires=None)
return resp
else:
return "login failed"
3.注销登录即设定登录时的key:value过期时间为0
resp.set_cookie(key='username', value='', expires=0)
resp.set_cookie(key='sessionId', value='', expires=0)
代码库:https://github.com/staugur/flask-thirdLogin-demo/tree/master/flask-cookie-login