部署到Ubuntu+Apache服务器后Django无法找到文件的排查求助
问题原因与解决方案
你遇到的核心问题是Python进程的工作目录在本地和服务器环境不一致:
- 本地用virtualenv运行时,你的工作目录是项目根目录(
mydashboard),所以相对路径"reports/dash_diversos.csv"能正确定位到文件。 - 而Apache运行WSGI应用时,默认的工作目录是Apache的系统目录(比如
/var/www/html或/etc/apache2),这个路径下根本没有reports文件夹,自然会抛出文件找不到的错误。
最佳解决方案:使用绝对路径定位文件
最可靠的方式是基于Django项目的根目录(BASE_DIR)来拼接文件的绝对路径,这样不管运行环境的工作目录是什么,都能准确找到文件。
修改你的utils.py代码如下:
from django.conf import settings import os def set_vehicles_negotiations(self): # 利用settings里的BASE_DIR(项目根目录)拼接绝对路径 csv_file_path = os.path.join(settings.BASE_DIR, 'reports', 'dash_diversos.csv') with open(csv_file_path, 'rt', encoding='utf8') as csvfile: # 你的后续代码 ...
备选方案:通过文件路径推导项目根(不依赖Django settings)
如果不想导入Django的settings模块,也可以通过当前utils.py的文件位置来推导项目根目录:
import os # 获取当前utils.py文件的绝对路径 current_file_path = os.path.abspath(__file__) # 获取utils.py所在的dashboard目录 dashboard_dir = os.path.dirname(current_file_path) # 获取项目根目录(dashboard的上一级) project_root = os.path.dirname(dashboard_dir) # 拼接csv文件路径 csv_file_path = os.path.join(project_root, 'reports', 'dash_diversos.csv') def set_vehicles_negotiations(self): with open(csv_file_path, 'rt', encoding='utf8') as csvfile: # 你的后续代码 ...
额外检查事项
- 确认文件与目录存在:登录服务器,检查
/var/www/dashboard/reports/dash_diversos.csv是否存在,确保部署时把reports文件夹和文件一起上传了。 - 设置正确的文件权限:Apache的运行用户通常是
www-data,需要赋予该用户读取文件的权限:# 设置文件所属用户组为www-data sudo chown www-data:www-data /var/www/dashboard/reports/dash_diversos.csv # 设置文件可读权限 sudo chmod 644 /var/www/dashboard/reports/dash_diversos.csv - 重启Apache服务:修改代码或权限后,记得重启Apache使变更生效:
sudo systemctl restart apache2
内容的提问来源于stack exchange,提问作者William Zimmermann
相关产品推荐
相关产品推荐

