Flask登录会话异常:登录后无法跳转至Index页面求助
Flask登录会话功能异常修复方案
问题描述
基于Python Flask框架开发带登录模块的应用,尝试在登录页与Index页间建立会话,但登录会话功能无法正常工作。
报错信息

相关代码
app.py
# 从flask模块导入Flask类 from flask import Flask, render_template, redirect, url_for, request, session # 创建应用对象 app = Flask(__name__) app.secret_key = "hello" # 使用装饰器将函数与URL关联 #@app.route('/') #def home(): # return "Hello, World!" # 返回字符串 @app.route('/index', methods=['GET']) def index(): if session.get ('username'): return render_template('index.html') else: return render_template('login.html') # 渲染模板 # 处理登录页面逻辑的路由 @app.route('/', methods=['GET', 'POST']) def login(): error = None if request.method == 'POST': if request.form['username'] != 'admin' or request.form['password'] != 'admin': error = 'Invalid Credentials. Please try again.' else: session['username'] = True return redirect(url_for('index')) return render_template('login.html', error=error) # 使用run()方法启动服务器 if __name__ == '__main__': app.run(debug=True)
login.html
<html> <head> <title>Flask Intro - login page</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <div class="container"> <h1>请登录</h1> <br> <form action="" method="post"> <input type="text" placeholder="用户名" name="username" value="{{ request.form.username }}"> <input type="password" placeholder="密码" name="password" value="{{ request.form.password }}"> <input class="btn btn-default" type="submit" value="登录"> </form> {% if error %} <p class="error"><strong>错误:</strong> {{ error }}</p> {% endif %} </div> </body> </html>
index.html
<!DOCTYPE Html> <html> <head> <title>站点页面</title> </head> <body> <address>欢迎访问。</address> </body> </html>
修复步骤
修正会话存储与判断逻辑
登录成功后建议存储实际用户名而非布尔值,同时在index路由中重定向到登录路由而非直接渲染模板,保持路由一致性:
修改app.py中login函数的成功分支:else: session['username'] = request.form['username'] return redirect(url_for('index'))修改index函数:
def index(): if session.get('username'): return render_template('index.html') else: return redirect(url_for('login'))修复index.html的标题标签错误
将原代码中的<tile>标签修正为标准的<title>标签,确保页面标题正常显示。优化表单提交路径(可选)
为login.html的表单明确指定提交路径,避免路径歧义:<form action="{{ url_for('login') }}" method="post">提升secret_key安全性(生产环境必做)
开发环境可临时使用简单密钥,但生产环境需使用随机复杂字符串:import os app.secret_key = os.urandom(24)
内容的提问来源于stack exchange,提问作者Fregene
相关产品推荐
相关产品推荐

