Flask注册功能无法稳定跳转至登录页面问题求助
Flask注册后无法跳转至登录页面问题解决
我在PyCharm中使用Flask搭建简易网站,开发用户注册与登录功能时遇到问题:填写合规的用户名和密码提交注册表单后,页面仅刷新,无法稳定跳转至登录页面。以下是我编写的相关代码:
注册HTML表单
<form method="POST" action="{{url_for('register')}}"> <!-- Defines username Fields --> <label for="username">Username:</label> <input type="text" id="username" name="username" required><br><br> <!-- Defines password Fields --> <label for="password">Password:</label> <input type="password" id="password" name="password" required><br><br> <!-- Defines Register Button --> <button type="submit">Register</button> </form>
登录HTML表单
<form method="POST" action="{{url_for('login')}}"> <!-- Defines username Fields --> <label for="username">Username:</label> <input type="text" id="username" name="username" required><br><br> <!-- Defines password Fields --> <label for="password">Password:</label> <input type="password" id="password" name="password" required><br><br> <!-- Defines Login Button --> <button type="submit">Login</button> </form>
登录与注册路由代码
from datetime import date import re from flask import Flask, render_template, request, redirect, url_for, session # Calls the imported flask function and sets to render the web pages in the "template" form app = Flask(__name__, template_folder='template') app.secret_key = 'your_secret_key' #User Data and variables being used users = [{'username': 'password'}] #Password Complexity PASSWORD_REGEX = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{12,}$' # Defining the website routes @app.route('/') # Sets up registration page for the site @app.route('/register', methods=['GET', 'POST']) def register(): '''Function that renders the registration page''' if request.method == 'POST': # Establishes the username and password variables to be inputted into the form username = request.form['username'] password = request.form['password'] if username in users: # Refreshes the page and prints a message when username already exists. return render_template('register.html', message='Username already exists.') if not re.match(PASSWORD_REGEX, password): # Refreshes the page and prints a message when password isn't complex enough return render_template('register.html', message='Password complexity not met.') users[username] = password # Redirects to the login screen return redirect(url_for('login')) return render_template('register.html',date=date.today()) # Sets up login page for the site @app.route('/login', methods=['GET', 'POST']) def login(): '''Function that renders the login page''' if request.method == 'POST': # Establishes the username and password variables to be inputted into the form username = request.form['username'] password = request.form['password'] if username in users and users[username] == password: session['username'] = username # Redirects to the home page screen return redirect(url_for('home_page')) # Refreshes the page and prints a message when username already exists. return render_template('login.html', message='Invalid credentials.') #Renders the login page return render_template('login.html',date=date.today())
问题根源
核心错误在于用户数据存储的变量类型错误:
你初始化users为列表:users = [{'username': 'password'}],但后续注册逻辑中却将其当作字典使用(users[username] = password),这会触发TypeError,导致注册流程中断,页面只能刷新而无法执行跳转。
同时,原代码中if username in users:的判断逻辑无效——在列表中,in会检查用户名是否等于列表中的某个元素(即判断字符串是否等于字典),永远返回False,无法检测用户名是否已存在。
修复方案
- 修正用户数据存储类型:将
users初始化为空字典,而非列表:
# 替换原users初始化代码 users = {} # 若需预设测试用户,可改为: # users = {'test_user': 'TestPass123!'}
验证密码复杂度:确保测试时输入的密码符合正则要求(至少12位,包含大小写字母、数字、特殊字符),避免因密码不符合规则停留在注册页。
补充缺失路由(可选):原代码中登录成功后跳转的
home_page路由未定义,需补充避免404错误:
@app.route('/home') def home_page(): if 'username' in session: return f'欢迎 {session["username"]}! 这是首页。' return redirect(url_for('login'))
修复后的完整路由代码
from datetime import date import re from flask import Flask, render_template, request, redirect, url_for, session app = Flask(__name__, template_folder='template') app.secret_key = 'your_secret_key' # 修正为字典类型存储用户数据 users = {} PASSWORD_REGEX = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{12,}$' @app.route('/') @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] if username in users: return render_template('register.html', message='用户名已存在。') if not re.match(PASSWORD_REGEX, password): return render_template('register.html', message='密码复杂度不符合要求。') users[username] = password return redirect(url_for('login')) return render_template('register.html', date=date.today()) @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] if username in users and users[username] == password: session['username'] = username return redirect(url_for('home_page')) return render_template('login.html', message='用户名或密码错误。') return render_template('login.html', date=date.today()) # 补充首页路由 @app.route('/home') def home_page(): if 'username' in session: return f'欢迎 {session["username"]}! 这是首页。' return redirect(url_for('login'))
内容的提问来源于stack exchange,提问作者robert crawford
相关产品推荐
相关产品推荐

