Android应用上传文件至Django API请求超时,1像素图片亦触发
问题描述
我正在开发一款Android Studio应用,在通过Django API将图片从应用上传至服务器时遇到问题。所有请求均处于“pending”状态,2分钟后返回500超时错误。
测试情况:
- 分别通过Postman、Android应用、接口同目录下的JS文件发起请求,结果一致
- 排除文件大小问题(已测试1×1像素图片)
- 排除服务器资源不足问题(请求pending时RAM、CPU占用无变化)
- 客户端和服务器日志均无错误信息
接口代码如下:
@api_view(['POST']) def changeProfile(request): user_id = int(request.data.get('userId', '')) pfp_file = request.FILES.get('pfp', None) pfb_file = request.FILES.get('pfb', None) data = {'rescode': '0001', 'message': 'Profile updated'} # Set CORS headers response = Response(data) response = Response(data) response['Access-Control-Allow-Origin'] = '*' response['Access-Control-Allow-Credentials'] = 'true' response['Access-Control-Allow-Headers'] = 'content-type' response['Access-Control-Allow-Methods'] = 'POST, OPTIONS' return response
排查与解决建议
- 清理冗余响应代码:代码中连续两次执行
response = Response(data),属于无效冗余操作,建议删除其中一行,避免响应构建过程中出现未知异常。 - 规范CORS处理逻辑:手动设置CORS头容易遗漏OPTIONS预检请求的响应逻辑,直接使用
django-cors-headers库替代手动配置更可靠:- 安装库:
pip install django-cors-headers - 在
settings.py中添加配置:INSTALLED_APPS = [ ... 'corsheaders', ... ] MIDDLEWARE = [ ... 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', ... ] CORS_ALLOW_ALL_ORIGINS = True CORS_ALLOW_CREDENTIALS = True CORS_ALLOW_METHODS = ['POST', 'OPTIONS'] CORS_ALLOW_HEADERS = ['content-type']
- 安装库:
- 检查文件上传核心配置:
- 确认
settings.py中MEDIA_ROOT指定的目录存在且服务器进程有读写权限 - 核对
FILE_UPLOAD_MAX_MEMORY_SIZE等参数,即使小文件也可能因配置异常导致上传阻塞
- 确认
- 添加异常捕获与日志:在接口中加入异常捕获,强制记录潜在错误,比如
userId为空时的转换异常:import logging logger = logging.getLogger(__name__) @api_view(['POST']) def changeProfile(request): try: user_id = int(request.data.get('userId', 0)) # 给默认值避免空值转换报错 pfp_file = request.FILES.get('pfp', None) pfb_file = request.FILES.get('pfb', None) # 测试文件读写:如果文件存在则临时保存 if pfp_file: with open(f'/tmp/test_pfp.jpg', 'wb+') as f: for chunk in pfp_file.chunks(): f.write(chunk) data = {'rescode': '0001', 'message': 'Profile updated'} return Response(data) except Exception as e: logger.error(f"changeProfile接口错误: {str(e)}") return Response({'rescode': '0002', 'message': str(e)}, status=500) - 排查服务器网络与代理配置:
- 确认服务器端口对外开放,防火墙未拦截请求
- 若使用Nginx等反向代理,检查
proxy_read_timeout是否设置过短,client_max_body_size是否允许文件上传
- 拆分测试逻辑:先编写一个不带文件上传的简单POST接口,验证基础连通性,确认无问题后再逐步添加文件上传逻辑
内容的提问来源于stack exchange,提问作者C0MPL3X
相关产品推荐
相关产品推荐

