← 返回首页
Python3基础教程(九十六)
发表时间:2023-04-17 04:23:10
用户登录案例

使用Flask框架实现一个简单的用户登录案例。

1.实现模板视图文件

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        h1 {
            text-align: center;
        }

        #main {
            margin: 0 auto;
            position: relative;

        }

        .login_box {
            width: 320px;
            height: 80px;
            position: relative;
            top: 0;
            left: 0;
            bottom: 0;
            right: 0;
            margin: auto;

            display: flex;
            border: 1px solid #ccc;
            border-radius: 6px;
            justify-content: space-around;
            background: #F6F6F6;
            flex-flow: row wrap;
            padding: 18px;

        }


        .login_title {
            width: 20%;
        }

        .login_controller {
            width: 80%;
            text-align: start;
        }

        .login_controller input {
            width: 240px;
        }

        .login_submit {
            width: 80%;
            text-align: center;
        }

        .login_submit input {
            width: 120px;
        }

        #login_msg {
            margin: 0 auto;
            width: 320px;
            color: red;
            padding: 5px;
        }

    </style>
</head>
<body>
<h1>用户登录</h1>
<hr>
<div id="main">
    <form name="loginForm">
        <div id="login_msg"></div>
        <div class="login_box">
            <div class="login_title">用户名:</div>
            <div class="login_controller"><input type="text" name="username" id="username" value=""/></div>
            <div class="login_title">密码:</div>
            <div class="login_controller"><input type="password" name="password" id="password" value=""/></div>
            <div class="login_submit"><input type="button" value="登录" onclick="doLogin()"></div>
        </div>
    </form>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
    function doLogin() {
        console.log("-----执行用户登录------")
        login_user = {
            username: $("#username").val(),
            password: $("#password").val()
        }

        console.log("-----登录用户对象-----")
        console.log(login_user)

        $.ajax({
            //请求方式
            type: "POST",
            //请求的媒体类型
            contentType: "application/json;charset=UTF-8",
            //请求地址
            url: "http://127.0.0.1:8080/users/auth",
            //数据,json字符串
            data: JSON.stringify(login_user),
            //请求成功
            success: function (resp) {
                console.log(resp)
                if (resp.code === 200) {
                    window.location.href = '/users/login_success'
                }
                if(resp.code === 400){
                    $("#login_msg").text(resp.msg)
                }
            },
            //请求失败,包含具体的错误信息
            error: function (err) {
                console.log(err);
            }
        })
    }
</script>
</body>
</html>

login_success.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        h1 {
            text-align: center;
        }
    </style>
</head>
<body>
<h1>登录成功</h1>
<hr>
</body>
</html>

2.实现用户业务接口

login_demo.py

# -*- coding: utf-8 -*-
# @Author: simoniu
# @Time : 2023/4/17 10:05
# @File : login_demo.py
# @Software : PyCharm

from flask import Flask, request, render_template, redirect, flash, abort, jsonify
import json

app = Flask(__name__)

# 模拟用户表的用户集合
users = {
    'root': '123456',
    'admin': '654321',
    'zhangsan': '666666'
}


# 路由: http://ip:port
@app.route('/users/login')
def login():
    return render_template('login.html')


# 需要用到POST方法;
# 通过route装饰器传递methods参数, 可以改变HTTP的方法;
@app.route('/users/auth', methods=['GET', 'POST'])
def auth():
    # 1. 判断http方法, 如果是post;
    if request.method == 'POST':
        # 2. 获取前端用户表单提交的数据;
        print('-----执行了/users/auth------')
        # 接收处理json数据请求
        data = json.loads(request.data)  # 将json字符串转为dict
        username = data['username']
        password = data['password']

        # 3. 判断用户名和密码是否正确?
        if username in users:
            # 跳转到另外一个页面
            if password == users[username]:
                print('-----登录成功----')
                # 返回json对象
                return jsonify(msg="登录成功", code=200)
            else:
                message = "用户密码错误"
                return jsonify(msg=message, code=400)
        else:
            message = "用户不存在, 请注册"
            return jsonify(msg=message, code=400)
    # 4. 如果不是post方法, 用户没有提交数据, 则进入登录界面;
    else:
        message = "请求方式不正确,请使用POST请求!"
        return jsonify(msg=message, code=400)


@app.route('/users/login_success')
def login_success():
    return render_template('login_success.html')


@app.errorhandler(404)
def show_404_page(e):
    return render_template('404.html'), 404


@app.errorhandler(500)
def show_500_page(e):
    return render_template('500.html'), 500


# 抛出异常: abort
@app.route('/users/<id>')
def user(id):
    if int(id) in range(1, 10):
        return "hello user:" + str(id)
    else:
        abort(404)


if __name__ == '__main__':
    app.run(host="127.0.0.1", port=8080, debug=True)