Django生产环境域名访问时File字段更新失败及Admin登录异常
Django生产环境域名访问时File/Image字段更新失败+Admin登录异常问题排查与解决
问题现象
- 生产环境Django应用,用IP+
runserver启动时完全正常; - 通过域名访问时,无法更新File/Image字段,请求超时,错误日志反复出现:
<method 'read' of 'lsapi_wsgi.InputStream' objects> returned NULL without setting an error; - PC端无法登录Django Admin后台,仅移动端可以正常登录。
完整错误跟踪信息
SystemError at /admin/accounts/user/1/change/ <method 'read' of 'lsapi_wsgi.InputStream' objects> returned NULL without setting an error Request Method: POST Request URL: https://dev.temarico.com/admin/accounts/user/1/change/ Django Version: 4.1.7 Exception Type: SystemError Exception Value: <method 'read' of 'lsapi_wsgi.InputStream' objects> returned NULL without setting an error Exception Location: /home/temaricocom/virtualenv/API/Backends/3.8/lib/python3.8/site-packages/django/core/handlers/wsgi.py, line 28, in _read_limited Raised during: django.contrib.admin.options.change_view Python Executable: /home/temaricocom/virtualenv/API/Backends/3.8/bin/python Python Version: 3.8.12 Python Path: ['/home/temaricocom/API/Backends', '', '/home/temaricocom/API/Backends', '/opt/alt/python38/lib64/python38.zip', '/opt/alt/python38/lib64/python3.8', '/opt/alt/python38/lib64/python3.8/lib-dynload', '/home/temaricocom/virtualenv/API/Backends/3.8/lib64/python3.8/site-packages', '/home/temaricocom/virtualenv/API/Backends/3.8/lib/python3.8/site-packages'] Server time: Sun, 19 Mar 2023 09:45:19 +0300
排查与解决思路
1. 针对LiteSpeed LSAPI的输入流异常
这个错误是LiteSpeed服务器的lsapi_wsgi.InputStream对象读取时返回NULL导致的,核心是服务器WSGI配置和Django的兼容性问题:
- 核对LiteSpeed的Python LSAPI版本和项目Python版本(3.8.12)是否一致,版本不匹配极易引发这类底层异常;
- 调整LiteSpeed的
max_body_size(最大请求体大小)和request_timeout(请求超时时间),尤其是上传图片/文件时,默认限制可能不够; - 开启LiteSpeed的
Request Body Buffering选项,确保请求体被完整缓冲后再传递给Django处理,避免流读取中断。
2. 修复Django WSGI处理逻辑
Django的wsgi.py中_read_limited方法在处理LSAPI输入流时存在兼容问题,可以尝试:
- 在项目的
wsgi.py中重写WSGIRequest的输入流处理逻辑,捕获NULL返回的情况并做兜底处理; - 尝试升级Django到4.2.x稳定版,或降级到4.0.x版本,验证是否是特定版本的兼容bug。
3. 解决Admin PC端登录异常
PC端无法登录、移动端正常,大概率是Cookie或CSRF配置问题:
- 检查Django配置中的
SESSION_COOKIE_DOMAIN和CSRF_COOKIE_DOMAIN,确保域名设置正确,没有针对PC端做特殊限制; - 清空PC端浏览器的缓存和Cookie,重新尝试登录,避免旧Cookie干扰;
- 如果用了反向代理,检查代理配置是否篡改了PC端的请求头(比如User-Agent)或Cookie参数。
4. 替代方案:切换WSGI服务器
如果LiteSpeed的问题难以快速定位,可以临时切换到Gunicorn+Nginx组合验证:
- 安装Gunicorn:
pip install gunicorn; - 启动应用:
gunicorn --bind 0.0.0.0:8000 your_project.wsgi:application; - 配置Nginx反向代理指向Gunicorn的端口,测试域名访问是否恢复正常。
内容的提问来源于stack exchange,提问作者Murad
相关产品推荐
相关产品推荐

