POST请求/upload-avatar/遇404及JSON解析错误,求排查解决
核心问题分析
404错误说明请求没匹配到Django的upload-avatar路由,JSON解析错误是因为服务器返回了HTML格式的404页面,前端硬要按JSON解析才触发语法错误。问题根源大概率是Apache没配置好请求转发,导致请求压根没到Django处理。
具体排查修复步骤
1. 补全Apache的Django WSGI转发配置
你当前只加载了mod_wsgi模块,但没配置把请求转给Django的WSGI入口文件,这是最关键的缺失项。在httpd.conf里添加以下配置:
# 把根路径请求转发到Django的wsgi.py文件 WSGIScriptAlias / "${INSTALL_DIR}/www/Chat/MediaSave/wsgi.py" # 告诉WSGI进程Django项目的Python路径 WSGIPythonPath "${INSTALL_DIR}/www/Chat/MediaSave" # 给wsgi.py所在目录配置访问权限 <Directory "${INSTALL_DIR}/www/Chat/MediaSave"> <Files wsgi.py> Require all granted </Files> </Directory>
注意替换${INSTALL_DIR}/www/Chat/MediaSave为你实际的Django项目根目录(就是包含wsgi.py的那个文件夹)。
2. 检查Django的MEDIA配置
确保settings.py里的MEDIA参数配置正确,不然文件存不了:
import os MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/'
同时手动在项目根目录建media/photos文件夹,给它设755权限,保证Apache能写入。
3. 修正前端请求路径(可选)
如果你的Django不是部署在Apache根路径,前端硬写/upload-avatar/容易出错。建议用Django模板生成正确URL:
<!-- 在HTML模板里加个隐藏域存路由 --> <input type="hidden" id="uploadUrl" value="{% url 'upload_avatar' %}">
然后JS里拿这个URL发请求:
const uploadUrl = document.getElementById('uploadUrl').value; fetch(uploadUrl, { method: 'POST', body: formData })
4. 验证Apache配置并重启
- 检查配置语法:打开WAMP的Apache菜单,选
Service -> Test port 80,或者去Apache的bin目录跑httpd -t命令。 - 重启Apache服务,让新配置生效。
5. 测试路由是否生效
直接在浏览器访问http://localhost/upload-avatar/,如果返回JSON格式的错误信息(比如{"error": "An error occurred while uploading the photo."}),说明路由已经通了;要是还跳404页面,再核对Apache里的WSGI路径有没有写错。
额外提醒
虽然你用了@csrf_exempt跳过CSRF验证,但生产环境建议保留。可以在前端请求里加CSRF令牌:
const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value; fetch('/upload-avatar/', { method: 'POST', headers: { 'X-CSRFToken': csrfToken }, body: formData })
记得在HTML模板里加{% csrf_token %}。
内容的提问来源于stack exchange,提问作者Dream

