Python Flask: 实现用户登录功能

来自CloudWiki
跳转至: 导航搜索

创建模板文件

在templates目录下创建login.html模板文件:

{% extends 'layout.html' %}

{% block body %}
<div class="content">
  <h1 class="title-center">用户登录</h1>
  <form action="" method="POST" onsubmit="return checkLogin()">
    <div class="form-group">
      <label>用户名</label>
      <input type="text" name="username" class="form-control" value={{request.form.username}}>
    </div>
    <div class="form-group">
      <label>密码</label>
      <input type="password" name="password" class="form-control" value="">
    </div>
    <button type="submit" class="btn btn-primary">登录</button>
  </form>
</div>

<script>
  function checkLogin(){
      var username = $("input[name='username']").val()
      var password = $("input[name='password']").val()
      // 检测用户名长度
      if ( username.length < 2  || username.length > 25){
        alert('用户名长度在2-25个字符之间')
        return false;
      }
      // 检测密码长度
      if ( username.length < 2  || username.length > 25){
        alert('密码长度在6-20个字符之间')
        return false;
      }
  }
</script>

{% endblock %}

实现登录功能

登录函数login()

# 用户登录
@app.route('/login', methods=['GET', 'POST'])
def login():
    if "logged_in" in session:  # 如果已经登录,则直接跳转到控制台
        return redirect(url_for("dashboard"))

    if request.method == 'POST': # 如果提交表单
        # 从表单中获取字段
        username = request.form['username']
        password_candidate = request.form['password']
        sql = "SELECT * FROM users  WHERE username = '%s'" % (username) # 根据用户名查找user表中记录
        db = MysqlUtil() # 实例化数据库操作类
        result = db.fetchone(sql) # 获取一条记录
        if result : # 如果查到记录
            password = result['password']  # 用户填写的密码
            # 对比用户填写的密码和数据库中记录密码是否一致
            if sha256_crypt.verify(password_candidate, password): # 调用verify方法验证,如果为真,验证通过
                # 写入session
                session['logged_in'] = True
                session['username'] = username
                flash('登录成功!', 'success') # 闪存信息
                return redirect(url_for('dashboard')) # 跳转到控制台
            else:  # 如果密码错误
                error = '用户名和密码不匹配'
                return render_template('login.html', error=error) # 跳转到登录页,并提示错误信息
        else:
            error = '用户名不存在'
            return render_template('login.html', error=error)
    return render_template('login.html')

控制台函数dashboard()

用于登录之后模拟控制台:

# 用户登录
@app.route('/dashboard', methods=['GET', 'POST'])
def dashboard():
    return "欢迎光临"

效果图

Python22011602.png