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

Django及MongoDB场景下NoneType无is_absolute属性AttributeError排查

问题解决办法

错误根本原因

AttributeError: 'NoneType' object has no attribute 'is_absolute'报错的核心是调用dns.resolver.resolve()时传入的第一个查询参数为None,该方法预期接收合法的域名字符串,传入空值后内部调用is_absolute()方法时报错。
你上传文件、操作MongoDB也出现同类报错,本质都是代码未做空值校验,直接对可能为None的对象调用属性/方法导致的,以下是针对性修复步骤:

修复步骤

1. 修复index.html的表单嵌套错误

HTML语法不允许表单嵌套,你当前的文件上传表单写在了域名查询表单的内部,会导致提交任意一个按钮时参数都可能丢失,是触发空值报错的直接诱因。同时文件上传必须用POST方法,不能用GET。
修正后的表单部分代码:

<!-- 域名查询表单 独立 -->
<form action="{% url 'index' %}" method="post">
    {% csrf_token %}
    <div class="form-group">
        <label>
            <input type="text" class="form-control" name="search" placeholder="Enter website">
        </label>
    </div>
    <input type="submit" class="btn btn-primary" value="Search">
</form>

<p></p>
<p>点击“Choose File”按钮上传文件:</p>
<!-- 文件上传表单 独立,method改为POST -->
<form enctype = "multipart/form-data" action="action_page.py" method="post">
    {% csrf_token %}
    <input type="file" id="myFile" name="filename">
    <input type="submit" value="upload">
</form>

2. 修复views.py的空值校验逻辑

增加查询参数非空判断,避免空值传入dns解析方法,同时优化多A记录的返回逻辑:

import dns.resolver
from django.shortcuts import render

def Index(request):
    context = {"ip_address": "请输入要查询的域名"}
    # 仅POST请求且存在search参数时执行解析
    if request.method == "POST":
        search = request.POST.get('search')
        # 非空校验
        if search and search.strip():
            try:
                my_resolver = dns.resolver.Resolver()
                ip_address = my_resolver.resolve(search.strip(), "A")
                # 拼接所有A记录,避免只返回最后一条
                ips = [i.to_text() for i in ip_address]
                context["ip_address"] = "、".join(ips)
            except Exception as e:
                context["ip_address"] = f"解析失败:{str(e)}"
    return render(request, 'index.html', context)

3. 修复action_page.py的逻辑

Django项目不推荐单独用CGI脚本处理上传,建议把上传逻辑合并到Django视图中,如果要保留该脚本,需要增加参数非空校验:

import cgi
import os
import cgitb; cgitb.enable()

form = cgi.FieldStorage()
# 先判断参数是否存在
if 'filename' in form:
    fileitem = form['filename']
    if fileitem.filename:
        fn = os.path.basename(fileitem.filename)
        open(fn, 'wb').write(fileitem.file.read())
        print("文件上传成功")
else:
    print("未获取到上传文件")

4. MongoDB同类报错排查

找到MongoDB操作相关的代码行,对所有调用属性/方法的对象提前做非空校验,确认对象不为None后再执行后续操作即可。

内容的提问来源于stack exchange,提问作者ishu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:06:04