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

Django项目登录后无法重定向至指定页面,页面仅刷新

Django登录页面仅刷新的问题修复

你的代码存在几个关键问题,导致登录时页面刷新且无法正常跳转:

问题分析

  1. 缺失User模型导入:代码中使用User.objects.get但未导入Django内置的User模型,会引发未定义错误。
  2. User对象不存在时未处理:当自定义用户表中存在用户,但Django auth系统的User表中无对应记录时,user_obj会为None,调用login(request, user_obj)会抛出异常,导致服务器500错误,表现为页面刷新。
  3. 数据库资源未释放:查询后未关闭游标和数据库连接,可能导致连接泄漏。
  4. 重复导入模块:重复导入ObjectDoesNotExist,属于冗余代码。

修复步骤

  1. 导入Django内置的User模型。
  2. 当Django auth系统中无对应用户时,自动创建该用户(需确保密码处理正确)。
  3. 检查user_obj是否有效后再执行登录操作。
  4. 释放数据库游标和连接资源。
  5. 移除重复导入的模块。

修正后的views.py代码

from django.contrib.auth import authenticate, login
from django.contrib.auth.models import User  # 新增User模型导入
from django.shortcuts import render, redirect
import mysql.connector
from django.core.exceptions import ObjectDoesNotExist

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user_obj = None 
        cnx = None
        cursor = None
        try:
            cnx = mysql.connector.connect(user='root', password='', database='projet')
            cursor = cnx.cursor()
            
            # 从自定义表查询用户
            query = "SELECT * FROM projetpythonn_user WHERE username=%s AND password=%s"
            cursor.execute(query, (username, password))
            user = cursor.fetchone()
            print(user)
            
            if user is not None:
                # 查找或创建Django系统用户
                try:
                    user_obj = User.objects.get(username=user[1])
                except ObjectDoesNotExist:
                    # 若Django用户不存在则创建,自动哈希明文密码
                    user_obj = User.objects.create_user(
                        username=user[1],
                        password=user[2],
                        email=user[3]
                    )
                
                # 确认用户有效后执行登录
                if user_obj is not None:
                    login(request, user_obj)
                    return redirect('/topic/')
                else:
                    message = '用户创建失败'
                    context = {'message': message}
                    return render(request, 'login.html', context)
            
            # 未查询到用户时返回错误
            message = 'Invalid username or password'
            context = {'message': message}
            return render(request, 'login.html', context)
        
        except mysql.connector.Error as error:
            print("Failed to connect to database: {}".format(error))
            message = '数据库连接失败'
            context = {'message': message}
            return render(request, 'login.html', context)
        finally:
            # 确保数据库资源被释放
            if cursor:
                cursor.close()
            if cnx:
                cnx.close()
    
    # GET请求渲染登录页
    return render(request, 'login.html')

额外注意事项

  • 密码存储处理:如果自定义用户表中存储的是哈希密码,需替换用户创建逻辑:先实例化User对象,再调用user_obj.set_password(user[2]),最后执行user_obj.save()。
  • 推荐优化:尽量使用Django ORM操作数据库,避免直接调用mysql.connector,如果使用自定义用户模型,需在settings.py中配置AUTH_USER_MODEL指向你的自定义模型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:43:13