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

如何用Python检测子域名是否存在?后端校验子域名需求咨询

Hey there! Let's tackle your two questions step by step—first detecting subdomains with Python, then building a backend validation flow for your registration form.

1. Using Python to Check if a Subdomain Exists

There are two reliable approaches here, depending on how strict you need the check to be:

Approach 1: Using socket (Quick and Simple)

The socket module can resolve a domain to an IP address, which tells you if the subdomain is configured to point somewhere. It's straightforward but might not catch edge cases like subdomains with only CNAME records (no A/AAAA records).

import socket

def does_subdomain_exist(subdomain: str, root_domain: str) -> bool:
    full_domain = f"{subdomain}.{root_domain}"
    try:
        # Try to resolve the domain to an IP
        socket.gethostbyname(full_domain)
        return True
    except socket.gaierror:
        # Failed to resolve—subdomain likely doesn't exist
        return False

# Example usage
print(does_subdomain_exist("blog", "example.com"))  # Returns True if blog.example.com exists

Approach 2: Using dns.resolver (More Reliable)

For better accuracy, use the dnspython library to directly query DNS records (A, AAAA, CNAME). This catches subdomains that only have CNAME entries (common for aliases). First install the library with pip install dnspython.

import dns.resolver

def check_subdomain_dns(subdomain: str, root_domain: str) -> bool:
    full_domain = f"{subdomain}.{root_domain}"
    # Check for A/AAAA records first
    try:
        dns.resolver.resolve(full_domain, 'A')
        return True
    except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer, dns.exception.Timeout):
        # If no A records, check for CNAME
        try:
            dns.resolver.resolve(full_domain, 'CNAME')
            return True
        except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer, dns.exception.Timeout):
            return False

# Example usage
print(check_subdomain_dns("store", "example.com"))

Pro Tip: Add a timeout to DNS queries to avoid hanging your app if the DNS server is slow. You can configure this with dns.resolver.resolve(full_domain, 'A', lifetime=5) (5-second timeout).

2. Backend Validation for Registration Forms (With Frontend JS Already in Place)

Frontend validation is great for user experience, but it can be bypassed—so backend validation is non-negotiable. Here's how to build a robust flow:

Step 1: First Validate the Subdomain Format

Before checking if it exists, ensure the subdomain follows your rules (e.g., no special characters, length limits, reserved names).

import re

def is_valid_subdomain_format(subdomain: str) -> tuple[bool, str]:
    # Regex: lowercase letters, numbers, hyphens only; no leading/trailing hyphens
    pattern = r'^[a-z0-9]+(?:-[a-z0-9]+)*$'
    if not re.match(pattern, subdomain):
        return False, "Subdomain can only contain lowercase letters, numbers, and hyphens (no leading/trailing hyphens)."
    
    if len(subdomain) < 3 or len(subdomain) > 63:
        return False, "Subdomain must be between 3 and 63 characters long."
    
    # Block reserved subdomains (customize this list to fit your needs)
    reserved_names = {'www', 'mail', 'admin', 'api', 'ftp', 'test', 'dev', 'blog'}
    if subdomain in reserved_names:
        return False, f"'{subdomain}' is a reserved subdomain and cannot be used."
    
    return True, "Subdomain format is valid."

Step 2: Combine Format + Existence Check in Your Backend Endpoint

Here's an example using Flask (adjust for your framework like Django/FastAPI):

from flask import Flask, request, jsonify

app = Flask(__name__)
ROOT_DOMAIN = "your-app-domain.com"  # Replace with your actual root domain

@app.route('/api/check-subdomain', methods=['POST'])
def check_subdomain_availability():
    data = request.get_json()
    subdomain = data.get('subdomain', '').strip().lower()
    
    if not subdomain:
        return jsonify({"success": False, "message": "Subdomain is required."}), 400
    
    # First validate format
    format_valid, format_msg = is_valid_subdomain_format(subdomain)
    if not format_valid:
        return jsonify({"success": False, "message": format_msg}), 400
    
    # Then check if it exists
    if check_subdomain_dns(subdomain, ROOT_DOMAIN):
        return jsonify({"success": False, "message": "This subdomain is already taken."}), 409
    
    # All checks passed
    return jsonify({"success": True, "message": "Subdomain is available!"})

if __name__ == '__main__':
    app.run(debug=True)

Critical Notes for Production:

  • Concurrency Safety: Two users could check the same subdomain at the same time, both get "available", then try to register. Fix this by adding a database unique constraint on the subdomain field, or using a lock during the check-and-create process.
  • Rate Limiting: Add rate limiting to your endpoint to prevent abuse (e.g., with Flask-Limiter).
  • Cache Results: Cache DNS lookup results temporarily (e.g., 5 minutes) to reduce redundant queries.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:25:47