Django API应用部署后突发VariableDoesNotExist错误求解决方案
我之前碰到过类似的问题,结合你的报错信息和使用的版本(djangorestframework==3.10.3、Django==2.2.7)来看,这个问题的核心是纯API服务触发了Django的模板渲染逻辑,而你的应用并没有配置对应的模板变量,导致运行一段时间后(触发未捕获异常时)出现VariableDoesNotExist: Failed lookup for key [exception_type]的错误,进而影响用户登录。
下面是具体的解决步骤:
1. 确认生产环境的DEBUG配置
如果你的生产环境还设置了DEBUG=True,这会导致Django在捕获异常时尝试渲染自带的错误模板,而DRF在DEBUG模式下的异常处理会依赖这些模板变量。请务必在生产环境设置:
# settings.py DEBUG = False ALLOWED_HOSTS = ['你的域名或服务器IP']
2. 自定义DRF异常处理,完全接管异常响应
因为你的应用是纯API服务,所有异常都应该返回JSON格式,而非HTML页面。你可以通过自定义DRF的异常处理函数来绕过Django的模板渲染:
首先在项目目录下创建utils.py,添加以下代码:
from rest_framework.views import exception_handler from rest_framework.response import Response from rest_framework import status def custom_exception_handler(exc, context): # 先调用DRF默认的异常处理逻辑,获取标准响应 response = exception_handler(exc, context) # 如果默认处理未生成响应(比如遇到Django原生异常),手动构建JSON响应 if response is None: return Response( { 'detail': str(exc), 'error_code': 'internal_server_error' }, status=status.HTTP_500_INTERNAL_SERVER_ERROR ) return response
然后在settings.py中配置DRF使用这个自定义处理函数:
REST_FRAMEWORK = { 'EXCEPTION_HANDLER': '你的项目名称.utils.custom_exception_handler', # 其他DRF配置项... }
3. 排查第三方工具的异常处理干扰
如果你的项目使用了监控、错误追踪类的第三方中间件(比如Sentry、New Relic等),请检查这些工具的配置,确保它们不会触发Django的模板渲染流程,而是直接返回JSON格式的错误信息。
4. 定位触发异常的根源问题
这个错误是“运行一段时间后”才出现,说明存在某个偶发的未捕获异常(比如数据库连接超时、内存泄漏导致的对象异常、接口参数处理错误等)。建议配置Django的日志系统,记录详细的错误堆栈信息:
# settings.py LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'ERROR', 'class': 'logging.FileHandler', 'filename': '/var/log/django/error.log', }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'ERROR', 'propagate': True, }, }, }
通过分析日志找到触发异常的具体场景,从源头修复问题。
按照上面的步骤处理后,所有异常都会被转化为JSON响应,不会再触发Django的模板渲染流程,也就不会出现exception_type变量找不到的错误了。
内容的提问来源于stack exchange,提问作者Sachin Singh

