自定义404/500错误页后,随机URL返回500而非404的原因排查
这种情况通常是你的自定义404视图本身抛出了异常,导致Django转而返回500错误。下面是几个最常见的排查方向:
1. 自定义404视图的模板存在错误
你的error_404视图尝试渲染shop/errors/404.html,如果这个模板里有语法错误(比如无效的Django模板标签、引用了不存在的变量、静态文件路径错误),或者模板文件根本不存在,那么渲染模板时就会抛出异常,直接触发500错误。
你可以先临时修改error_404视图,简化成最基础的版本测试:
def error_404(request): return HttpResponse("404 Not Found", status=404)
如果这个版本能正常返回404,那就说明问题出在你的404模板里,需要仔细检查模板的语法和资源引用。
2. handler404配置位置错误
Django只会读取项目根目录下的urls.py中的handler404和handler500配置,如果你把这些代码写在了某个app的urls.py里,Django是不会识别的。这时候当404发生时,Django会尝试使用默认视图,若默认视图也出现异常(或者DEBUG=False时默认处理逻辑出错),就可能返回500错误。
确认你的handler404 = error_404和handler500 = error_500是放在项目根urls.py中,而非某个app的urls文件里。
3. DEBUG模式与ALLOWED_HOSTS配置问题
当DEBUG=False时,Django要求必须正确配置ALLOWED_HOSTS(在settings.py中),如果没有设置或者设置不正确,Django会抛出DisallowedHost异常,这个异常会被当作500错误处理,而非404。
检查你的settings.py:
ALLOWED_HOSTS = ['your-domain.com', 'www.your-domain.com'] # 替换成你的实际域名
如果是本地测试,可以暂时设置为ALLOWED_HOSTS = ['*'](生产环境不建议这么做),看看是否能解决问题。
4. 500视图本身的连锁问题?
虽然你遇到的是访问不存在路径返回500,但也可以先测试你的error_500视图是否正常工作。比如故意在某个视图里抛出异常,看看是否能正确渲染500模板,如果500模板也有问题,可能会出现连锁错误,但这种情况相对少见。
内容的提问来源于stack exchange,提问作者Brachamul

