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

