通过设置 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 提供的认证扩展或其他第三方库来实现。