Django如何从根目录引用文件到应用目录并解决访问拒绝报错
问题背景
开发功能时需要创建接收HTML文件输入的条目,在测试用例中尝试引用项目根目录下的nice.html模板创建EmailTemplate记录,运行代码时触发访问拒绝报错,需要确认测试用例中正确引用目标HTML模板的方案。
问题相关代码
# CREATE EMAIL TEMPLATE data = { "user":user, "platform_subscriber":project, "name": "TESTCASE TEMPLATE", "html_template": "../nice.html" } email_template, created = EmailTemplate.objects.custom_get_or_create(data) print("The key",email_template) self.email_template = email_template.id
报错日志
raise SuspiciousOperation("Attempted access to '%s' denied." % name) django.core.exceptions.SuspiciousOperation: Attempted access to '../nice.html' denied.
报错原因
这个报错是Django内置的安全校验机制触发的:代码中传入的../nice.html包含路径遍历字符../,这类写法会尝试跳出程序预设的允许访问目录,属于典型的路径遍历风险,Django会直接拦截抛出SuspiciousOperation异常。另外直接传路径字符串的写法本身也不符合Django文件字段、内容字段的赋值逻辑,不会自动读取对应路径的文件内容。
正确实现方案
- 禁止在路径参数中使用
../这类向上跳转的相对路径,所有本地文件引用都要基于固定的项目根目录(Django中可直接导入settings.BASE_DIR)拼接得到绝对路径,从根源上避免路径遍历问题。 - 根据
html_template的字段类型选择对应的赋值方式:- 首先拼接得到模板文件的绝对路径:
import os from django.conf import settings template_abs_path = os.path.join(settings.BASE_DIR, "nice.html")- 如果
html_template是FileField类的文件存储字段,需要传入Django封装的File对象,不能直接传路径字符串:
from django.core.files import File with open(template_abs_path, "rb") as f: data = { "user": user, "platform_subscriber": project, "name": "TESTCASE TEMPLATE", "html_template": File(f, name="nice.html") } email_template, created = EmailTemplate.objects.custom_get_or_create(data)- 如果
html_template是TextField类的文本字段,用于直接存储HTML代码内容,读取文件内容后传入即可:
with open(template_abs_path, "r", encoding="utf-8") as f: template_content = f.read() data = { "user": user, "platform_subscriber": project, "name": "TESTCASE TEMPLATE", "html_template": template_content } email_template, created = EmailTemplate.objects.custom_get_or_create(data) - 拿到
email_template对象后再绑定到测试用例实例属性即可:print("The key", email_template) self.email_template = email_template.id
内容的提问来源于stack exchange,提问作者Ahmed Yasin
相关产品推荐
相关产品推荐

