登录注册系统非常简单,在之前的文章中也提到过。

由于 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

参考资料:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140240726395479019cb0be724e7db42936babd5f9717000

·End·