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

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