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

o2switch服务器上Django应用上传PDF/CSV文件超时求助

问题描述

在o2switch服务器部署Django应用后,向media文件夹上传文件时,.txt和.xlsx文件可正常处理,但上传.pdf或.csv文件会出现超时错误,且请求未到达服务器(无日志记录)。同一域名下的PHP脚本测试显示所有文件类型均可正常上传,因此问题可能源于Django Rest Framework(DRF)应用本身,或是o2switch的特定配置。

可能的原因及排查步骤

一、o2switch服务器配置限制

  • 文件类型拦截:部分主机商会针对WSGI环境设置特定文件类型的上传拦截规则,虽然PHP脚本不受影响,但Django应用可能被限制。联系o2switch客服确认是否存在针对WSGI应用的.pdf/.csv文件过滤策略。
  • 请求大小限制:检查服务器端的请求体大小限制,比如Apache的LimitRequestBody、Nginx的client_max_body_size,或是Passenger的passenger_max_request_body_size。如果.pdf/.csv文件体积大于可正常上传的文件,可能触发大小限制导致请求被直接拦截,未到达应用层。
  • 超时时间设置:服务器的连接超时、请求超时配置过短,大体积的.pdf/.csv上传时超出时限,被服务器主动断开连接。

二、DRF/Django相关配置问题

  • 文件上传解析配置:检查settings.py中是否修改了默认的FILE_UPLOAD_HANDLERS,自定义处理器可能对特定文件类型处理异常。默认处理器如下,若有自定义配置,暂时恢复默认测试:
    FILE_UPLOAD_HANDLERS = [
        'django.core.files.uploadhandler.MemoryFileUploadHandler',
        'django.core.files.uploadhandler.TemporaryFileUploadHandler',
    ]
    
  • CSRF验证异常:部分场景下特定文件类型的请求可能因前端请求头差异触发CSRF验证失败,检查DRF视图是否正确排除CSRF验证,或前端是否正确携带CSRF令牌。
  • 自定义中间件拦截:排查项目中的自定义中间件,是否存在针对文件扩展名的过滤逻辑,导致.pdf/.csv请求被拦截,无法到达视图层。
  • 生产环境media服务配置:static()函数仅在DEBUG=True时生效,若部署时DEBUG=False,需配置服务器(Apache/Nginx)直接处理media请求,同时确保media文件夹的写入权限正确。

三、Python版本相关(可能性较低)

Python 3.8.18本身对.pdf/.csv文件处理无已知兼容性问题,但如果项目使用第三方库处理这类文件(如pandas处理csv),可能存在版本兼容问题。不过你的问题是请求未到达服务器,因此该类问题优先级较低,优先排查前两类。

附用户提供的配置代码

WSGI配置代码

import os
import sys
sys.path.append(os.getcwd())
os.environ['DJANGO_SETTINGS_MODULE'] = 'Back_end_Gaz_elec.settings'
import django.core.handlers.wsgi
from django.core.wsgi import get_wsgi_application
SCRIPT_NAME = os.getcwd()
class PassengerPathInfoFix(object):
    def __init__(self, app):
        self.app = app
    def __call__(self, environ, start_response):
        from urllib.parse import unquote
        environ['SCRIPT_NAME'] = SCRIPT_NAME
        request_uri = unquote(environ['REQUEST_URI'])
        script_name = unquote(environ.get('SCRIPT_NAME', ''))
        offset = request_uri.startswith(script_name) and len(environ['SCRIPT_NAME']) or 0
        environ['PATH_INFO'] = request_uri[offset:].split('?', 1)[0]
        return self.app(environ, start_response)
application = get_wsgi_application()
application = PassengerPathInfoFix(application)

settings.py中静态与媒体文件配置

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

urls.py配置

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('application.urls')),
    path('api-dashboard/', include('admin_dashboard.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
STATIC_URL = '/static/'

依赖版本信息

Django==4.0.3
django-cleanup==6.0.0
django-cors-headers==3.11.0
django-environ==0.11.2
djangorestframework==3.13.1
djangorestframework-jwt==1.11.0
djangorestframework-simplejwt==5.1.0

内容的提问来源于stack exchange,提问作者Chrif Slimen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:37:34