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

Django注册表单开发遇Too Many Redirects错误求助

Django注册表单“Too Many Redirects”错误排查与修复

问题描述

我正在为Django项目开发注册表单HTML页面,但遇到了“Too Many Redirects(重定向次数过多)”错误。以下是我的代码:

URL配置代码

from . import views
from django.urls import path
app_name = 'credentials'
urlpatterns = [
   path('register/', views.register, name='register'),
   path('login/', views.login, name='login'),
   path('logout/', views.logout, name='logout')
]

视图函数代码

def register(request):
if request.method == 'POST':
    username = request.POST['username']
    firstname = request.POST['first_name']
    lastname = request.POST['last_name']
    email = request.POST['email']
    password = request.POST['password']
    confirmpassword = request.POST['password2']

    if password == confirmpassword:
        if User.objects.filter(username=username).exists():
            messages.info(request, 'Username Taken')
            return redirect('register')
        elif User.objects.filter(email=email).exists():
            messages.info(request, 'Email Taken')
            return redirect('register')`

        user = User.objects.create_user(username=username, first_name=firstname, last_name=lastname, email=email,
                                        password=password)
        user.save()
        messages.info(request, 'USER REGISTERED')
        print('USER REGISTERED')

else:
    messages.info(request, 'password did not match!!')
    return redirect('credentials:register')
    return redirect('/')
return render(request, 'register.html')

错误原因分析

  1. 缩进逻辑完全混乱:当前代码里的else块对应request.method == 'POST'的分支,导致用户用GET请求访问注册页时,会直接执行return redirect('credentials:register'),形成死循环——访问注册页→重定向回注册页→重复操作,最终触发“Too Many Redirects”。
  2. 密码校验逻辑放错位置:原本用来判断密码不匹配的代码,被错误放到了处理GET请求的分支里,逻辑完全错位。
  3. 语法错误:elif User.objects.filter(email=email).exists():行末尾多了一个反引号(`),会直接导致代码报错。
  4. 注册成功后无跳转:用户注册成功后没有重定向,会停留在注册页面,不符合正常流程。

修复后的视图代码

from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib import messages

def register(request):
    # GET请求:直接渲染注册页面
    if request.method == 'GET':
        return render(request, 'register.html')
    
    # POST请求:处理注册提交
    username = request.POST['username']
    firstname = request.POST['first_name']
    lastname = request.POST['last_name']
    email = request.POST['email']
    password = request.POST['password']
    confirmpassword = request.POST['password2']

    # 检查密码是否匹配
    if password != confirmpassword:
        messages.info(request, '密码不匹配!')
        return redirect('credentials:register')
    
    # 检查用户名是否已存在
    if User.objects.filter(username=username).exists():
        messages.info(request, '用户名已被占用')
        return redirect('credentials:register')
    
    # 检查邮箱是否已存在
    if User.objects.filter(email=email).exists():
        messages.info(request, '邮箱已被占用')
        return redirect('credentials:register')
    
    # 创建并保存用户
    user = User.objects.create_user(
        username=username, 
        first_name=firstname, 
        last_name=lastname, 
        email=email,
        password=password
    )
    user.save()
    messages.success(request, '用户注册成功')
    print('USER REGISTERED')
    
    # 注册成功后重定向到首页
    return redirect('/')

关键修复说明

  • 明确拆分GET/POST请求逻辑:GET请求直接渲染页面,彻底解决重定向循环问题。
  • 把密码校验、用户名/邮箱查重的逻辑全部放到POST分支内,逻辑更清晰。
  • 移除多余的语法错误字符。
  • 注册成功后添加明确的重定向,避免停留在注册页。
  • 用messages.success区分成功提示,交互更友好。

内容的提问来源于stack exchange,提问作者shakkeer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:57:20