Django使用MySQL认证时出现'NoneType'不可下标错误求助
解决Django登录时的'NoneType' object is not subscriptable错误
嘿,我来帮你搞定这个登录问题!这个错误其实是几个小问题凑到一起导致的,咱们一步步拆解修复:
问题根源分析
- SQL语句语法错误:你把字段名
email和password用单引号括起来了,数据库会把它们当成普通字符串,而不是表的字段,所以永远查不到匹配的数据,cur.fetchone()就会返回None。 - 索引越界+未判断空值:就算查到数据,你用
data[2]和data[3]也是错的——你只查了email和password两个字段,返回的元组索引是0(对应email)和1(对应password)。而且没判断data是否为None,直接去下标访问就触发了那个错误。 - 不必要的事务提交:查询操作不需要
con.commit(),只有增删改数据时才需要提交事务。 - SQL注入风险:直接把用户输入拼到SQL语句里,很容易被注入攻击,这是严重的安全问题。
修复后的代码
def login(request): # 先处理请求方式,避免GET请求时报错(可选但推荐) if request.method != 'POST': return render(request, "login.html") # 假设你的登录页面是login.html email = request.POST.get('email', '') password = request.POST.get('password', '') # 建立数据库连接 con = mysql.connector.connect(user='root', password='', host='localhost', database='company') cur = con.cursor() # 使用参数化查询,避免SQL注入,同时修复字段名的引号问题 sql = "SELECT email, password FROM buyerregister WHERE email = %s AND password = %s" cur.execute(sql, (email, password)) data = cur.fetchone() # 查询操作不需要commit cur.close() con.close() # 先判断data是否存在,再验证内容 if data is not None and data[0] == email and data[1] == password: return render(request, "purchase.html") else: # 这里可以加个错误提示,比如传给模板一个错误信息 return render(request, "order.html", {'error': '邮箱或密码错误'})
额外建议(Django最佳实践)
其实在Django里,不推荐直接用mysql.connector操作数据库,Django自带的ORM(对象关系映射)更安全、更便捷,还能帮你避免很多低级错误。比如你可以先定义一个BuyerRegister模型,然后用BuyerRegister.objects.filter(email=email, password=password).first()来查询,代码会更简洁,也不用手动管理连接。不过如果你现在是为了完成毕业项目先解决当前问题,上面的代码已经能正常工作了。
内容的提问来源于stack exchange,提问作者chakrapani Patchava
相关产品推荐
相关产品推荐

