Django升级后redirect特殊字符转义异常导致next跳转失效问题
Django升级后登录重定向异常问题解决方案
问题原因
- 路径格式错误触发二次重定向:你使用的跳转路径
/admin/login缺少尾斜杠,Django默认开启APPEND_SLASH配置,会自动将无尾斜杠且未匹配到路由的路径301重定向到带尾斜杠的路径,重定向过程中会将原请求的完整路径作为新的next参数拼接,最终生成嵌套的双重next参数,就是你观测到的next=/admin/login%3Fnext%3D/my_page异常。 - Admin安全校验拦截非内部路径:Django 4.0及以上版本对Admin登录页的next参数增加了安全校验规则,默认仅允许跳转至Admin站点内部路由,你传入的
/my_page不属于Admin内部路径,会被校验逻辑直接丢弃,登录完成后自动跳转至Admin默认首页/admin/。
解决方法
推荐优先使用Django官方提供的登录跳转辅助函数,避免手动拼接路径导致的各类异常:
- 导入
redirect_to_login工具函数
from django.contrib.auth.views import redirect_to_login
- 替换原有的redirect逻辑,直接传入目标跳转路径和登录页地址即可,函数会自动处理参数编码、路径格式、校验规则适配:
# 替换原来的 return redirect('/admin/login?next=/my_page') 行 return redirect_to_login(next='/my_page', login_url='/admin/login/')
如果需要保留手动拼接路径的写法,按以下规则修正:
- 补全登录路径的尾斜杠,改为
/admin/login/ - 对next参数做URL编码,避免特殊字符解析异常:
import urllib.parse query = urllib.parse.urlencode({'next': '/my_page'}) return redirect(f'/admin/login/?{query}')
如果需要全局配置登录后默认跳转路径,可在settings.py中添加配置:
LOGIN_REDIRECT_URL = '/my_page'
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

