Apache WSGI部署Django项目POST请求无日志失败排查求助
问题排查指南:Apache+mod_wsgi部署DRF后POST请求无响应无日志
老哥,先给你吃个定心丸——Django REST Framework(DRF)和mod_wsgi完全兼容,不存在原生的兼容性问题!你遇到的POST请求失败且无日志的情况,大概率是配置疏漏、请求拦截或者日志范围的问题,咱们一步步拆解排查:
一、先确认请求真的到达了Apache
既然无效URL能被日志捕获,但POST API不行,首先得搞清楚请求到底有没有走到Apache这一步:
- 用
curl模拟POST请求,带上详细调试信息:
仔细看返回的状态码、响应内容,同时开个终端实时监控Apache日志:curl -v -X POST http://localhost/你的API端点路径/ -d '{"key": "value"}' -H "Content-Type: application/json"tail -f /var/log/apache2/error.log /var/log/apache2/access.log - 如果curl显示连接超时/失败,那可能是请求被防火墙、本地代理拦截了;如果返回了4xx/5xx状态但日志里没记录,那问题大概率出在日志配置上。
二、检查Apache虚拟主机的日志范围
你的当前配置用的是全局日志,有可能POST请求没匹配到这个虚拟主机,或者日志被分流了。可以给当前虚拟主机单独配置日志试试:
把虚拟主机里的ErrorLog和CustomLog替换成:
ErrorLog ${APACHE_LOG_DIR}/myapp_error.log CustomLog ${APACHE_LOG_DIR}/myapp_access.log combined
然后重启Apache:
sudo systemctl restart apache2
再发POST请求,查看新生成的myapp_error.log和myapp_access.log,看有没有记录。
三、核对WSGI配置与文件权限
从你贴的虚拟主机配置看,有几个关键点要确认:
- 虚拟环境路径:
python-home=/home/pi/WebApp/p3是否正确?可以进入虚拟环境执行which python,确认路径和配置里的一致。 - 文件权限:Apache运行的用户(通常是
www-data)有没有权限读取你的项目目录,以及写入日志/临时文件?执行以下命令修复权限:sudo chown -R www-data:www-data /home/pi/myapp/myapp2/myapp sudo chmod -R 755 /home/pi/myapp/myapp2/myapp - WSGIApplicationGroup:你配置的
WSGIApplicationGroup %{GLOBAL}是对的,这个设置能避免很多Python库的线程安全问题,不用改。
四、排查Django&DRF层面的拦截
因为其他功能(管理页、登录等)都正常,POST请求可能被Django中间件或DRF配置拦截了:
- 检查CSRF中间件:如果你的API是给前端页面调用,要确保前端正确传递了CSRF token;如果是给第三方客户端调用,需要在DRF视图里添加
@csrf_exempt装饰器,或者改用Token/JWT认证(推荐后者)。 - 检查Django settings:
- 确认
ALLOWED_HOSTS包含localhost或者*(测试用),不然请求会被直接拦截。 - 如果
DEBUG=True,生产环境建议关闭,因为DEBUG模式下部分错误会直接返回给客户端,不会写入Apache日志。
- 确认
- 开启Django自身日志:在
settings.py里添加日志配置,直接捕捉Django层面的错误:
记得先创建LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'django_file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': '/var/log/django/myapp.log', }, }, 'loggers': { 'django': { 'handlers': ['django_file'], 'level': 'DEBUG', 'propagate': True, }, }, }/var/log/django目录并给www-data权限:
之后发POST请求,查看这个日志文件,大概率能找到问题。sudo mkdir -p /var/log/django sudo chown www-data:www-data /var/log/django
五、用极简DRF视图做测试
排除业务逻辑的干扰,写个最简单的DRF POST视图:
# 在你的app的views.py里添加 from rest_framework.views import APIView from rest_framework.response import Response from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator @method_decorator(csrf_exempt, name='dispatch') class TestPostAPI(APIView): def post(self, request): return Response({'status': 'success', 'data': request.data}, status=200) # 在urls.py里添加路由 path('test-post/', TestPostAPI.as_view(), name='test-post'),
然后用curl请求http://localhost/test-post/,如果这个极简视图能正常响应,说明问题出在你业务视图的逻辑里;如果还是不行,那继续排查Apache/WSGI的配置。
内容的提问来源于stack exchange,提问作者user8951490
相关产品推荐
相关产品推荐

