Django项目登录后无法重定向至指定页面,页面仅刷新
Django登录页面仅刷新的问题修复
你的代码存在几个关键问题,导致登录时页面刷新且无法正常跳转:
问题分析
- 缺失User模型导入:代码中使用
User.objects.get但未导入Django内置的User模型,会引发未定义错误。 - User对象不存在时未处理:当自定义用户表中存在用户,但Django auth系统的User表中无对应记录时,
user_obj会为None,调用login(request, user_obj)会抛出异常,导致服务器500错误,表现为页面刷新。 - 数据库资源未释放:查询后未关闭游标和数据库连接,可能导致连接泄漏。
- 重复导入模块:重复导入
ObjectDoesNotExist,属于冗余代码。
修复步骤
- 导入Django内置的User模型。
- 当Django auth系统中无对应用户时,自动创建该用户(需确保密码处理正确)。
- 检查
user_obj是否有效后再执行登录操作。 - 释放数据库游标和连接资源。
- 移除重复导入的模块。
修正后的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
相关产品推荐
相关产品推荐

