如何使用Python及Flask动态捕获URL中的域名
嘿,这两个域名处理的场景在开发里挺常见的,我来给你一步步解决!
在Python Flask框架中捕获当前请求的域名
在Flask里,获取当前请求的域名超级方便,框架已经把请求相关的信息封装在request对象里了。这里有几个实用的属性可以直接用:
request.host:返回带端口的完整主机地址,比如本地调试时的localhost:5000,线上环境的stackoverflow.comrequest.hostname:只返回纯域名,自动忽略端口号,比如localhost或者stackoverflow.com
给你写个简单的视图函数示例,一看就懂:
from flask import Flask, request app = Flask(__name__) @app.route('/get-domain') def show_domain(): full_host = request.host pure_domain = request.hostname return f"带端口的主机地址: {full_host}\n纯域名: {pure_domain}" if __name__ == '__main__': app.run(debug=True)
要是你需要包含http/https协议的完整根路径,用request.root_url就好,它会返回类似https://stackoverflow.com/的结果,你也可以从这里拆分出域名。
从任意URL动态捕获域名
如果是处理外部的任意URL(不是Flask请求里的),我们可以用两种方法,分别适合不同场景:
方法1:用Python标准库urllib.parse(无需额外安装)
这个方法适合简单的域名提取,不需要处理子域名的情况:
from urllib.parse import urlparse def pull_domain_from_url(url): parsed = urlparse(url) # netloc字段包含域名和端口,比如stackoverflow.com或example.com:8080 domain_with_port = parsed.netloc # 拆分掉端口号(如果存在的话) clean_domain = domain_with_port.split(':')[0] return clean_domain # 测试你的示例URL sample_url = "https://stackoverflow.com/questions/ask" print(pull_domain_from_url(sample_url)) # 输出: stackoverflow.com
不过要注意,这个方法会保留子域名,比如输入https://www.example.com,它会返回www.example.com。如果你需要提取不带子域名的注册域名,比如example.com,就用下面的方法。
方法2:用第三方库tldextract(精准处理复杂域名)
tldextract专门做域名解析,能准确区分顶级域名(比如.com、.co.uk)、二级域名和子域名,完美支持动态域名场景。先安装它:
pip install tldextract
然后写个函数就能用:
import tldextract def extract_core_domain(url): result = tldextract.extract(url) # 把二级域名和顶级域名组合起来,得到注册域名 core_domain = f"{result.domain}.{result.suffix}" return core_domain # 测试示例URL sample_url = "https://stackoverflow.com/questions/ask" print(extract_core_domain(sample_url)) # 输出: stackoverflow.com # 测试带www和复杂后缀的URL complex_url = "https://blog.sub.example.co.uk/posts" print(extract_core_domain(complex_url)) # 输出: example.co.uk
这个方法不管URL结构怎么变,都能精准提取到你要的核心域名,完全满足动态URL和动态域名的需求。
内容的提问来源于stack exchange,提问作者sankar nataraj
相关产品推荐
相关产品推荐

