You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的字段类型选择对应的赋值方式:
    1. 首先拼接得到模板文件的绝对路径:
    import os
    from django.conf import settings
    template_abs_path = os.path.join(settings.BASE_DIR, "nice.html")
    
    1. 如果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)
    
    1. 如果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:36:27