添加sites配置后Django密码重置链接失效问题咨询
Django启用sites框架后密码重置链接异常的解决办法
问题根源
当你把django.contrib.sites加入INSTALLED_APPS并配置SITE_ID后,Django的密码重置邮件会自动读取django.contrib.sites.models.Site模型中对应ID的域名配置。默认情况下这个模型的初始记录域名是example.com,即便你在Admin后台修改了该记录,开发服务器可能因为缓存未刷新,导致新配置没生效。
具体解决步骤
- 重启开发服务器:修改Admin里的Site记录后,务必重启Django开发服务器,确保新的域名配置被加载。开发环境下Django会缓存ORM数据,不重启的话旧配置会一直生效。
- 代码强制初始化Site记录:如果重启后问题仍存在,可以在主应用的
apps.py中添加初始化逻辑,确保Site记录正确:
替换from django.apps import AppConfig from django.contrib.sites.models import Site class YourMainAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_main_app_name' def ready(self): # 确保ID为1的Site记录是本地开发地址 site, _ = Site.objects.get_or_create(id=1) site.domain = '127.0.0.1:8000' site.name = '本地开发站点' site.save()your_main_app_name为你的主应用名称,启动服务器时会自动创建或更新对应Site记录。 - 核对SITE_ID配置:检查
settings.py中的SITE_ID值,确保和你在Admin中修改的Site记录ID一致。默认Site记录ID是1,如果你新建了Site记录,需要同步修改SITE_ID。 - 开发环境临时自定义域名:如果需要快速绕过sites框架的影响,可以重写密码重置视图,强制指定域名:
然后在from django.contrib.auth.views import PasswordResetView class CustomPasswordResetView(PasswordResetView): def generate_reset_link(self, user, token): # 直接生成本地开发地址的重置链接 return f"http://127.0.0.1:8000/reset/{user.pk}/{token}/"urls.py中替换原密码重置视图的路径,指向这个自定义视图。
补充说明
生产环境中修改Site记录后无需重启服务,但要保证SITE_ID与配置的Site记录严格对应。开发环境下的缓存问题是导致修改Admin配置无效的主要原因,重启服务器是最直接的解决方式。
内容的提问来源于stack exchange,提问作者wsrt
相关产品推荐
相关产品推荐

