Django部署后文件存在却提示‘file wasn't available on site’问题求助
问题排查与解决方案
1. 检查媒体文件的Django核心配置
在settings.py中确认以下配置是否适配服务器环境:
MEDIA_ROOT:必须设置为服务器上的绝对路径,示例:import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) MEDIA_ROOT = os.path.join(BASE_DIR, 'Media')MEDIA_URL:要与你生成的下载URL前缀完全匹配,示例:MEDIA_URL = '/Media/'- 项目根
urls.py需添加媒体文件路由(仅开发环境DEBUG=True时生效,生产环境依赖Web服务器配置):from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 你的其他路由 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
2. 替换硬编码URL,用Django存储API生成路径
不要手动拼接dataurl和Processed_DataURL,改用FileSystemStorage的url()方法自动生成正确路径,避免大小写、路径拼接错误:
- 在
create_project视图中修改:fs = FileSystemStorage(location=f'Media/Projects/{user}') filename = fs.save(data.name, data) dataurl = fs.url(filename) # 替代手动拼接的路径 - 在
process视图中修改:fs = FileSystemStorage(location=f'Media/Projects/Despiked/{user}') filename = fs.save(excel_file, open(excel_file, 'rb')) project.Processed_DataURL = fs.url(filename) # 替代硬拼路径
3. 修正大小写匹配问题
Linux服务器是大小写敏感的,而Windows本地环境不敏感,需确认:
- 代码中写的
Media目录名,与服务器上实际目录名大小写完全一致(比如服务器上是media而代码写Media会直接找不到) - 文件名的大小写也需完全匹配,比如本地的
Despiked - Test File.xlsx和服务器上的文件名称不能有大小写差异
4. 修复文件与目录权限
确保Web服务器进程(如Apache的www-data、Nginx的nginx用户)对Media目录及其子目录、文件拥有读取权限,以Ubuntu服务器为例执行命令:
sudo chown -R www-data:www-data /path/to/your/project/Media sudo chmod -R 755 /path/to/your/project/Media
5. 配置Web服务器的媒体文件路由(生产环境必做)
Django在生产环境DEBUG=False时不会处理媒体文件请求,必须通过Web服务器直接映射:
Nginx配置示例
在虚拟主机配置中添加:
location /Media/ { alias /path/to/your/project/Media/; expires 30d; }
Apache配置示例
在虚拟主机配置中添加:
Alias /Media/ /path/to/your/project/Media/ <Directory /path/to/your/project/Media/> Require all granted </Directory>
配置完成后重启Web服务器生效。
内容的提问来源于stack exchange,提问作者Silent
相关产品推荐
相关产品推荐

