Django Web API被遗留设备访问时返回404错误的排查求助
问题排查与解决方案
核心问题1:设备请求路径格式不匹配
从日志能明确看到,设备调用时发送的请求路径是完整的https://192.168.10.120:8001/User/GetUserName.aspx,而Django的路由是基于相对路径(/User/GetUserName.aspx)匹配的,这直接导致路由无法匹配,返回404。Flask对这种带完整域名的路径兼容性更好,所以能正常响应。
解决办法:
- 检查设备API配置:确认设备是否误将完整URL作为
path参数发送,而非仅填写路径部分。若为配置问题,修改设备的API请求路径为/User/GetUserName.aspx,将域名和端口单独配置。 - 若设备因遗留限制无法修改配置,可在Django中添加兼容处理:
编写中间件截取请求路径中的完整URL前缀,保留相对路径。示例代码:
将该中间件添加到from django.http import HttpRequest class FixFullUrlPathMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request: HttpRequest): # 剥离完整URL前缀,修复请求路径 if request.path.startswith('https://'): _, _, _, path_part = request.path.split('/', 3) request.path = f'/{path_part}' response = self.get_response(request) return responsesettings.py的MIDDLEWARE列表中(放在靠前位置)。
核心问题2:HTTPS连接配置异常
设备强制使用HTTPS,你之前用自签名证书搭建服务器时无日志输出,大概率是设备验证证书失败后直接终止连接,导致Django未收到请求。
解决办法:
正确启动Django HTTPS开发服务器:
Django 3.0+版本可直接用内置服务器启动HTTPS:python manage.py runserver 0.0.0.0:8001 --cert /path/to/your/cert.pem --key /path/to/your/key.pem低版本需借助
django-extensions的runserver_plus:# 先依赖安装 pip install django-extensions werkzeug # 启动HTTPS服务器 python manage.py runserver_plus 0.0.0.0:8001 --cert localhost处理证书信任问题:
- 将自签名证书导出为
.pem或.cer格式,导入到设备的信任证书库(操作参考设备文档)。 - 若设备支持
verify=false选项,为对应API配置禁用证书验证,避免因证书不被信任断开连接。
- 将自签名证书导出为
额外验证步骤
- 用curl模拟设备的异常请求,验证路径问题:
(curl -X GET "https://192.168.10.120:8001/https://192.168.10.120:8001/User/GetUserName.aspx" -k-k参数禁用证书验证),查看是否返回404,确认路径匹配问题。 - 检查Django的
ALLOWED_HOSTS配置:确保settings.py中ALLOWED_HOSTS包含192.168.10.120,避免因主机头验证失败导致的异常。
内容的提问来源于stack exchange,提问作者simplyvish
相关产品推荐
相关产品推荐

