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
相关产品推荐
相关产品推荐

