You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署的Django Rest Framework API在所有带请求体的请求中返回“Server got itself in trouble”500错误

部署的Django Rest Framework API在所有带请求体的请求中返回“Server got itself in trouble”500错误

我正在把自己的Django Rest API部署到一台运行Ubuntu 24.04 LTS、使用Apache的外部Web服务器上——这台服务器不是我搭建的,内部细节对我来说完全是个黑箱。

最近遇到了一个非常棘手的问题:不管用GET、POST、PUT、PATCH还是DELETE方法,只要请求带了请求体,就会触发500错误,提示“Server got itself in trouble”。

比如,带请求体的GET请求就会返回这个错误:
For instance, a GET request with some payload will give this error

但如果去掉请求体的话,就不会出现这个500错误了——只会返回缺少必要参数的预期错误:
The same request, but without a request body

下面是一些已知的服务器架构细节,可能对排查问题有帮助:
Diagram of how the external server works

  • 应用运行在Gunicorn容器中
  • 客户端请求先到反向代理,再被转发到应用
  • 应用监听并处理 incoming 请求

附上我的settings.py配置(目前开了DEBUG=True来排查问题):

"""
Django settings for server project.

Generated by 'django-admin startproject' using Django 5.1.4.

For more information on this file, see
https://docs.djangoproject.com/en/5.1/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/5.1/ref/settings/
"""

from pathlib import Path
from datetime import timedelta
from cryptography.fernet import Fernet
import sys
import environ 
import os

env = environ.Env()
environ.Env.read_env()

USE_X_FORWARDED_HOST = True

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-(ltwgqma)#6=y3!dcw4b&8sog&%y@i51d1ye*(w_fk$9p0tvip'

ENCRYPTED_FIELDS_KEY = env('ENCRYPTED_FIELDS_KEY')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['*']


# Application definition

INSTALLED_APPS = [
    'daphne',
    'django_eventstream',
    
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    'django_extensions',
    
    'django_apscheduler',
    'rest_framework',
    'rest_framework_simplejwt.token_blacklist',
    'corsheaders',
    
    'apps.api'
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'server.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# WSGI_APPLICATION = 'server.wsgi.application'
ASGI_APPLICATION = "server.asgi.application"

# Database
# https://docs.djangoproject.com/en/5.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'server.com',
        'NAME': env('DB_NAME'),
        'USER': env('DB_USERNAME'),
        'PASSWORD': env('DB_PASSWORD')
    }
}

# Password validation
# https://docs.djangoproject.com/en/5.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True

FIXTURE_DIRS = [
    'fixtures'
]

STATIC_URL = 'static/'

MEDIA_ROOT =  os.path.join(os.path.dirname(BASE_DIR), "server/media")

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

CORS_ALLOW_ALL_ORIGINS = True

AUTH_USER_MODEL = "users.User"

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ],
     'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
    ],
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
    ]
}
SIMPLE_JWT = {
     'ACCESS_TOKEN_LIFETIME': timedelta(minutes=10),
     'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
     'ROTATE_REFRESH_TOKENS': True,
     'BLACKLIST_AFTER_ROTATION': False,
     
     'USER_ID_FIELD': 'user_id'
}

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
        },
    },
    "root": {
        "handlers": ["console"],
        "level": "WARNING",
    },
}

if 'test' in sys.argv:
    DATABASES['default'] = {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'test'
    }

我能访问服务器的日志,但日志里只有api/users 404: Bad request这类信息,完全找不到关于这个500错误的有效排查线索。

恳请各位大佬帮忙分析一下问题出在哪!


EDIT:
我和维护这台服务器的团队一起找到了解决方案。他们的文档提到用a2wsgi提供兼容层,我一开始尝试了这个方案,但它和django_eventstream的兼容性很差,导致了异步相关的错误。后来我切换回预期的WSGI模式,并替换了django_eventstream的替代方案,问题就彻底解决了。

备注:内容来源于stack exchange,提问作者fiocotti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:13:01