Django项目views.py无法读取同目录文件报FileNotFoundError问题
问题原因
这不是Django的访问限制,本质是Python相对路径的解析规则导致的:
- 用
open("test.txt", "rb")这类纯文件名的相对路径时,Python不会以当前代码文件所在目录为基准找文件,而是以程序启动时的**当前工作目录(CWD)**为查找起点。 - 直接运行同目录下的
read_file.py时,你的启动目录就是脚本所在的目录,查找时刚好能匹配到同目录的test.txt,所以能正常运行。 - 启动Django服务时,一般是在项目根目录执行
python manage.py runserver命令,此时工作目录是项目根目录,不是views.py所在的子目录,自然找不到和views.py同目录的test.txt,触发FileNotFoundError。
修复方法
不要依赖启动时的工作目录写相对路径,基于当前代码文件的固定位置拼接绝对路径即可,两种常用写法:
基于os模块实现(兼容所有Python版本)
import os # 获取当前views.py所在的绝对目录路径 current_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接得到test.txt的完整路径 file_path = os.path.join(current_dir, "test.txt") fkey = open(file_path, "rb") key = fkey.read()
基于pathlib实现(Python3.4+支持,写法更简洁)
from pathlib import Path # 直接定位到当前文件同目录下的test.txt file_path = Path(__file__).resolve().parent / "test.txt" fkey = open(file_path, "rb") key = fkey.read()
提示:不要通过修改Django启动目录的方式临时绕开问题,基于
__file__变量拼接路径的方案兼容性最强,不管从哪个目录启动服务、部署到什么环境都能正常定位文件。
内容的提问来源于stack exchange,提问作者user19497472
相关产品推荐
相关产品推荐

