You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,无法检测用户名是否已存在。

修复方案

  1. 修正用户数据存储类型:将users初始化为空字典,而非列表:
# 替换原users初始化代码
users = {}
# 若需预设测试用户,可改为:
# users = {'test_user': 'TestPass123!'}
  1. 验证密码复杂度:确保测试时输入的密码符合正则要求(至少12位,包含大小写字母、数字、特殊字符),避免因密码不符合规则停留在注册页。

  2. 补充缺失路由(可选):原代码中登录成功后跳转的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:11:14