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
相关产品推荐
相关产品推荐

