Django连接MongoDB使用内置密码重置功能触发无信息DatabaseError
问题根源
你遇到的报错是djongo 1.3.6版本和Django 3.2内置PasswordResetView的默认查询语法不兼容导致的:
- 内置
PasswordResetView查询用户时默认使用email__iexact(大小写不敏感匹配),生成的SQL用到了iLIKE语法,djongo 1.3.6转译该语法为MongoDB查询时出现参数解析错误,导致数据库报错。 - 你看到的模板
VariableDoesNotExist报错是数据库查询失败后的附带异常,不是问题根源。
解决方案
方案1(推荐,无版本依赖):自定义密码重置视图,替换查询逻辑
重写PasswordResetView的get_users方法,将默认的大小写不敏感查询替换为djongo支持的查询逻辑:
- 在你的app视图文件中添加自定义视图:
from django.contrib.auth.views import PasswordResetView from django.contrib.auth import get_user_model User = get_user_model() class CustomPasswordResetView(PasswordResetView): def get_users(self, email): # 替换默认的iexact查询,规避djongo语法适配问题 active_users = User._default_manager.filter(**{ 'email__exact': email, 'is_active': True, }) return (u for u in active_users if u.has_usable_password())
如果业务需要支持邮箱大小写不敏感匹配,可以把查询条件改为email__icontains=email,djongo对icontains的适配比iexact更稳定。
2. 修改urls.py中的路由配置,替换默认视图:
path('pw_reset/', CustomPasswordResetView.as_view(), name="reset_password"),
方案2:更换djongo版本
djongo 1.3.6版本存在多个ORM查询转译bug,你可以尝试更换版本解决适配问题:
# 升级到最新稳定版 pip install --upgrade djongo # 或者降级到适配更稳定的1.3.4版本 pip install djongo==1.3.4
修改完成后重启服务,再次测试密码重置功能即可正常运行。
内容的提问来源于stack exchange,提问作者kaka
相关产品推荐
相关产品推荐

