问题描述
Django项目部署到服务器后无法获取到静态元素 The requested resource was not found on this server。如图:

原因分析
- 当 DEBUG = False 时,Django 不会自动提供静态文件服务
- 在 urls.py 中,静态文件的路由是通过 static() 函数添加的,但这个函数只在 DEBUG = True 时才会生效
- 静态文件存储在 media/files 目录下,通过 /media/ URL 访问
解决方案
-
修改环境配置 在
backend/conf/env.py
中添加:pythonDEBUG = False SERVE_STATIC_FILES = True # 新增配置项
-
URL配置已自动处理
项目已配置了媒体文件路由,确保在生产环境中也能访问:
pythonpath("media/<path:file_path>", server_file, name="media_file"),
-
改进的server_file视图
backend/dvadmin/system/views/server_file.py
优化,包含:- 路径安全检查
- MIME类型支持
- 错误处理
- 多种文件格式支持
python
def server_file(request, file_path):
"""
处理媒体文件访问的视图
用于在生产环境中提供静态文件服务
Args:
request: HTTP请求对象
file_path: 文件路径(从URL中获取)
"""
# 清理文件路径
file_path = file_path.lstrip('/')
# 构建完整的文件路径
full_path = os.path.join(settings.MEDIA_ROOT, file_path)
# 安全检查:确保文件路径在MEDIA_ROOT目录内
if not os.path.abspath(full_path).startswith(os.path.abspath(settings.MEDIA_ROOT)):
raise Http404("文件路径无效")
# 检查文件是否存在
if not os.path.exists(full_path) or not os.path.isfile(full_path):
raise Http404("文件不存在")
# 获取文件扩展名
file_ext = os.path.splitext(full_path)[1].lower()
# 设置MIME类型
mime_types = {
'.pdf': 'application/pdf',
'.jpg': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.png': 'image/png',
'.gif': 'image/gif',
'.bmp': 'image/bmp',
'.svg': 'image/svg+xml',
'.txt': 'text/plain',
'.doc': 'application/msword',
'.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'.xls': 'application/vnd.ms-excel',
'.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'.zip': 'application/zip',
'.rar': 'application/x-rar-compressed',
'.7z': 'application/x-7z-compressed',
'.mp4': 'video/mp4',
'.avi': 'video/x-msvideo',
'.mp3': 'audio/mpeg',
'.wav': 'audio/wav',
}
content_type = mime_types.get(file_ext, 'application/octet-stream')
try:
# 返回文件响应
response = FileResponse(open(full_path, 'rb'), content_type=content_type)
# 设置文件名(用于下载)
filename = os.path.basename(full_path)
response['Content-Disposition'] = f'inline; filename="{filename}"'
return response
except Exception as e:
raise Http404(f"文件访问失败: {str(e)}")