在IIS上配置Django媒体文件遇文件写入失败问题求助
解决方案:IIS部署Django后无法写入文件的问题
遇到过一模一样的坑!这个报错本质是相对路径在IIS环境下的工作目录不匹配,不是单纯的权限问题(虽然权限也得仔细确认),给你一步步解决:
核心原因
Django在开发服务器(runserver)运行时,工作目录就是你的项目根目录,所以"media/testwrite.txt"能精准找到对应的文件夹。但部署到IIS后,应用池的默认工作目录是系统目录(比如C:\Windows\System32),程序会去这个陌生目录找media文件夹,自然找不到,就抛出FileNotFoundError了。
具体解决步骤
1. 改用Django提供的绝对路径(最关键)
直接用Django配置里的MEDIA_ROOT来拼接文件路径,这是最稳妥的方式:
from django.conf import settings from django.http import HttpResponse import os def fileWriteTest(request): # 用MEDIA_ROOT拼接文件路径,确保指向项目的media文件夹 file_path = os.path.join(settings.MEDIA_ROOT, "testwrite.txt") # 用with语句自动管理文件,避免忘记关闭导致资源泄漏 with open(file_path, "a", encoding="utf-8") as f: f.write("Now the file has more content!\n") print("File Written!") return HttpResponse("Done !")
2. 确认settings.py里的MEDIA_ROOT配置正确
确保你的settings.py里已经用项目根目录BASE_DIR正确拼接了MEDIA_ROOT:
# settings.py import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
这样MEDIA_ROOT就是你项目中media文件夹的绝对路径,无论部署环境怎么变,路径都不会错。
3. 重新确认权限(别漏了应用池身份)
虽然你说已经给了权限,但要确认是给IIS应用池的运行身份授权:
- 找到你的Django应用对应的IIS应用池,查看它的“标识”(默认可能是
ApplicationPoolIdentity) - 找到项目的
media文件夹,右键→属性→安全→编辑→添加,输入应用池的身份(比如IIS AppPool\你的应用池名称),给它读写权限
4. 验证工作目录(可选,用于排查)
如果还是不确定问题根源,可以在视图里打印当前工作目录,直观确认:
import os print("当前工作目录:", os.getcwd())
查看IIS的日志或者控制台输出,会发现工作目录根本不是你的项目根目录,这就彻底坐实了相对路径的问题。
额外建议
- 尽量避免使用相对路径操作文件,尤其是在服务器环境下,不同部署环境的工作目录差异很大
- 用
with语句操作文件,比手动close()更安全,能避免资源泄漏
内容的提问来源于stack exchange,提问作者harshawij
相关产品推荐
相关产品推荐

