flask 模拟简单的登录功能(2)

通过设置 app.secret_key 进行用户登录验证

通过使用app.secret_key,可以对会话数据进行加密和解密,以确保会话数据的安全性。会话数据包括用户的登录状态、表单数据等敏感信息,通过设置 app.secret_key,可以防止会话被恶意篡改或窃取。
app.py代码如下:

python 复制代码
from flask import Flask, request, session, redirect, url_for,render_template

app = Flask(__name__)
app.secret_key = 'your_secret_key'

# 模拟用户数据库
users = {
    'admin': 'admin'
}

# 根路径
@app.route('/')
def index():
    if 'logged_in' in session and session['logged_in']:
        return redirect(url_for('page'))
    else:
        return render_template('login2.html')
        
@app.route('/login', methods=['POST','GET'])
def login():
    print(request.method)
    if request.method == 'POST':
        print('post')
        username = request.form['username']
        password = request.form['password']
        if users.get(username) == password:
            session['logged_in'] = True
            return redirect(url_for('success'))
        else:
            return redirect(url_for('failed'))
    else:
        print('get')
        if 'logged_in' in session and session['logged_in']:
            return redirect(url_for('success'))
        return redirect(url_for('goto'))

# 登录成功
@app.route('/success')
def success():
    return f'login successfully!<a href = "/logout">退出登录</a>'

# 登录失败
@app.route('/failed')
def failed():
    return f'login failed!<a href = "/">重新登录</a>'

# 登录失败
@app.route('/goto')
def goto():
    return f'Please login first!<a href = "/">去登录</a>'
    
# 退出登录
@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    return 'Logged out,<a href = "/">点击重新登录</a>'

@app.route('/page')
def page():
    if 'logged_in' in session:
        return '这是授权页内容,<a href = "/logout">退出登录</a>'
    else:
        return redirect(url_for('login'))

if __name__ == '__main__':
    app.run()

login.html 页面入下:

html 复制代码
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <form action="http://localhost:5000/login" method="post">
        <table>
            <tr>
                <td>Username</td>
                <td><input type="username" name="username"></td>
            </tr>
            <tr>
                <td>Password</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td><input type="submit" value="Submit"></td>
            </tr>
        </table>
    </form>
    {% if error %}
    <p><strong>Error</strong>:{{error}}</p>
    {% endif %}
</body>
</html>

在上面的例子中,通过 POST 请求 /login 路由来接收用户提交的用户名和密码,并在用户登录成功时将 logged_in 标记设置为 True,表示用户已经登录。然后,在访问 /page 路由时,检查用户是否已登录,如果未登录则提示去登录。

注意,当我们在浏览器中点击登录按钮,表单通过 POST 请求提交到 /login 路由,如果登录成功,直接reurn 'Login successful'这样写的话,页面一开始进去显示 "Login successful",此时,如果在浏览器中直接进行页面刷新(比如按下 F5 键),浏览器会重新发送上一次的请求。如果上一次的请求是一个 POST 请求,那么刷新操作也会发送一个相同的 POST 请求,而不是一个 GET 请求。这是因为浏览器的刷新操作会重复最后一次的请求,不论它是 GET 请求还是 POST 请求。对于 POST 请求,许多浏览器会显示一个对话框,警告用户刷新页面将会重新提交表单。如果用户选择继续,浏览器就会再次发送 POST 请求到服务器。

为了避免在登录成功后直接刷新页面导致再次发送 POST 请求的问题,在这里我们 POST 请求并完成相关操作(比如用户登录)后,进行一个重定向操作到另一个页面或路由。这种方法被称为 Post/Redirect/Get (PRG) 模式,它可以防止表单的重复提交。

这只是一个简单的示例,实际应用中用户登录验证可能会更加复杂,包括密码哈希存储、用户会话管理等。对于更复杂的用户认证需求,建议使用 Flask 提供的认证扩展或其他第三方库来实现。

相关推荐
customer089 分钟前
【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源·intellij-idea
千澜空17 分钟前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
霍格沃兹测试开发学社测试人社区17 分钟前
软件测试学习笔记丨Flask操作数据库-数据库和表的管理
软件测试·笔记·测试开发·学习·flask
2402_8575893619 分钟前
SpringBoot框架:作业管理技术新解
java·spring boot·后端
斯凯利.瑞恩24 分钟前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
一只爱打拳的程序猿37 分钟前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring
yannan201903131 小时前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁1 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev1 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
好喜欢吃红柚子1 小时前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn