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

Django项目连接MongoDB时出现DNS查询名称不存在错误

Django接口调用MongoDB出现DNS查询错误的排查与解决

问题详情

在Django项目的/testapi/接口发起请求时,触发ConfigurationError错误,具体提示:

DNS查询名称不存在:_mongodb._tcp.none.mongodb.net

对应的工具函数(utils.py中提取MongoDB数据库列表的代码)单独运行Python文件时完全正常,但在Django项目中调用就出现上述错误。

相关代码

utils.py

from urllib.parse import quote_plus
from pymongo import MongoClient

def auth(username, password, cluster_uri):
    username = quote_plus(username)
    password = quote_plus(password)
    conn_str = "mongodb+srv://{}:{}@{}.mongodb.net/?retryWrites=true&w=majority".format(
        username,
        password,
        cluster_uri
    )
    return MongoClient(conn_str)

def getDatabaseList(username, password, cluster_address):
    client = auth(username, password, cluster_address)
    dbs = client.list_database_names()  # 返回数据库列表
    return dbs

views.py

from rest_framework import status
from rest_framework.decorators import permission_classes
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.permissions import AllowAny, IsAuthenticated
from .utils import getDatabaseList

@permission_classes([AllowAny])
class TestViewSet(APIView):
    def post(self, request):
        username = request.data.get('username')
        password = request.data.get('password')
        cluster_address = request.data.get('cluster_address')
        dblist = getDatabaseList(username, password, cluster_address)
        return Response({'dblist': dblist}, status=status.HTTP_200_OK)

错误原因

从错误信息里的none.mongodb.net可以直接定位问题:cluster_address参数值被解析成了字符串"none"。

原因是在Django视图中,request.data.get('cluster_address')没有获取到前端传入的有效集群地址,返回了None;而Python字符串格式化时会把None自动转换成字符串"none",最终拼接出的MongoDB连接串为mongodb+srv://xxx:xxx@none.mongodb.net/...,导致DNS解析失败。

单独运行工具函数时,手动传入了正确的集群前缀(比如cluster0),所以能正常连接;但在接口调用场景下,前端请求可能存在以下问题:

  • 未携带cluster_address参数
  • 参数名称拼写错误(比如写成cluster_addr)
  • 参数值为空字符串或无效值

解决方案

1. 增加请求参数校验

在视图函数中先校验必填参数的完整性,提前拦截无效请求:

def post(self, request):
    username = request.data.get('username')
    password = request.data.get('password')
    cluster_address = request.data.get('cluster_address')
    
    # 校验所有必填参数是否存在且非空
    if not username or not password or not cluster_address:
        return Response(
            {'error': '缺少必填参数:username、password、cluster_address'},
            status=status.HTTP_400_BAD_REQUEST
        )
    
    dblist = getDatabaseList(username, password, cluster_address)
    return Response({'dblist': dblist}, status=status.HTTP_200_OK)

2. 在工具函数中增加参数校验

在auth函数里提前判断集群地址是否有效,避免生成错误的连接串:

def auth(username, password, cluster_uri):
    # 校验集群地址非空
    if not cluster_uri or cluster_uri.strip() == "":
        raise ValueError("集群地址cluster_uri不能为空")
    
    username = quote_plus(username)
    password = quote_plus(password)
    conn_str = "mongodb+srv://{}:{}@{}.mongodb.net/?retryWrites=true&w=majority".format(
        username,
        password,
        cluster_uri
    )
    return MongoClient(conn_str)

3. 检查前端请求参数

确认前端发送POST请求时:

  • 参数名称和后端保持一致(必须是cluster_address)
  • 传入的cluster_address值是有效的MongoDB集群前缀(比如MongoDB Atlas提供的cluster0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:27:23