Django无法接收Roblox游戏POST请求问题求助
解决Roblox POST请求无法被Django接收的问题
一、先确认Django视图的正确性
你的日志只输出“Process working”但无POST数据,大概率是视图没正确获取请求内容。Roblox的HttpService:PostAsync默认会把table转成JSON发送,而非表单格式,直接用request.POST拿不到数据,需针对性解析:
from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt import logging import json logger = logging.getLogger(__name__) @csrf_exempt def roblox_webhook(request): logger.info("Process working") if request.method == 'POST': # 优先解析JSON格式(Roblox默认发送格式) try: post_data = json.loads(request.body) logger.info(f"Received JSON data: {post_data}") except json.JSONDecodeError: # fallback到表单格式 post_data = request.POST.dict() logger.info(f"Received form data: {post_data}") return HttpResponse("OK")
二、验证VPS本地服务可用性
先排除外部网络问题,在VPS本地用curl模拟Roblox请求:
- 模拟JSON请求:
curl -X POST -H "Content-Type: application/json" -d '{"playerId":12345,"action":"join"}' http://localhost:8000/你的webhook路径/ - 模拟表单请求:
curl -X POST -d "playerId=12345&action=join" http://localhost:8000/你的webhook路径/
查看Django日志,若本地请求能正常输出数据,说明视图没问题,问题出在VPS的外部网络或反向代理配置。
三、检查VPS网络与反向代理配置
- 防火墙端口开放:确保VPS的ufw防火墙开放了服务端口(如Nginx的80/443,或Django监听的8000):
ufw status # 若未开放,执行: ufw allow 80/tcp ufw allow 443/tcp - Nginx反向代理配置:如果用Nginx做反向代理,需确保配置正确传递请求体:
修改后重启Nginx:server { listen 80; server_name 你的域名或公网IP; location /你的webhook路径/ { proxy_pass http://localhost:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 关键:保留请求的Content-Type,确保JSON数据被正确传递 proxy_set_header Content-Type $content_type; proxy_pass_request_body on; } }sudo systemctl restart nginx
四、排查pm2运行的Django进程
- 检查pm2状态:
pm2 status,确认Django进程处于online状态,无异常退出。 - 查看pm2日志:
pm2 logs 你的进程名,排查是否有端口占用、依赖缺失或启动命令错误。 - 确保用生产级服务器运行:禁止用
python manage.py runserver上线,必须用gunicorn等生产服务器,pm2启动命令示例:pm2 start gunicorn --name "django-roblox" --workers 3 --bind 0.0.0.0:8000 你的项目名.wsgi:application
五、Django生产环境配置检查
- 确认
ALLOWED_HOSTS包含你的域名或VPS公网IP:ALLOWED_HOSTS = ['你的域名', 'x.x.x.x'] # x.x.x.x是VPS公网IP - 确保日志配置能输出INFO级别的内容,在
settings.py中:
同时要保证日志目录存在且有写入权限:LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'INFO', 'class': 'logging.FileHandler', 'filename': '/var/log/django/roblox_webhook.log', }, }, 'loggers': { '你的app名': { 'handlers': ['file'], 'level': 'INFO', 'propagate': True, }, }, }sudo mkdir -p /var/log/django sudo chown www-data:www-data /var/log/django
内容的提问来源于stack exchange,提问作者Krico
相关产品推荐
相关产品推荐

