深入解析域名短链接生成原理及其在Python/Flask中的实现策略:一篇全面的指南与代码示例

为了构建一个高效且用户友好的域名短链服务,我们可以将项目精简为以下核心功能板块:

1. 用户管理

  • 注册与登录:允许用户创建账户并登录系统。 这部分内容可以参考另一片文章实现:

快速实现用户认证:使用Python和Flask配合PyJWT生成与解密Token的教程及示例代码

  • 资料管理:用户可以管理自己的个人资料,包括密码修改等。

2. 短链接功能

  • 短链接生成:用户输入长链接,系统生成短链接。
  • 链接管理:用户可以查看、管理自己生成的所有短链接。
  • 访问统计:提供短链接的访问次数和基本访问数据统计。

3. API服务

  • 生成与查询API:供开发者使用的接口,实现短链接的生成和查询。

4. 系统管理

  • 日志记录:记录系统操作日志,便于维护和故障排查。
  • 性能监控:监测系统性能,确保服务的稳定性。

通过专注于这些核心板块,可以确保系统覆盖短链接服务的基本需求,同时保持项目的可管理性和扩展性。这样的结构既可以满足大多数用户的需求,也为将来添加新功能留下了空间。

本文章着重介绍以下几个功能块:

1、生成短链,保存短链

#学习交流 访问
# https://v.iiar.cn# 生成一个5位长度的随机大写字母和数字的组合
def generate_random_string(length=5):characters = string.ascii_uppercase + string.digits  # 大写字母和数字return ''.join(random.choice(characters) for _ in range(length))# 生成一个不重复的随机字符组合
def generate_unique_combination():while True:random_string = generate_random_string()existing_record = XUrlLink.query.filter_by(random_characters=random_string).first()if not existing_record:return random_string
# 创建短链接
def create_short_link_func(url_link, admin_id):# 随机字符random_string = generate_unique_combination()new_log = XUrlLink(url_link=url_link,random_characters=random_string,creator_id=admin_id)db.session.add(new_log)db.session.commit()#模型部分
class XUrlLink(db.Model):id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='主键ID')url_link = db.Column(db.String(500), comment='域名')random_characters = db.Column(db.String(100), comment='随机字符')creator_id = db.Column(db.Integer, default=0, comment='创建人id')creation_time = db.Column(db.DateTime, default=datetime.now, comment='创建时间')valid_status = db.Column(db.String(100), default='有效', comment='有效状态')def to_dict(self):return {'id': self.id,'url_link': self.url_link,'random_characters': self.random_characters,'creator_id': self.creator_id,'creation_time': self.creation_time.strftime('%Y-%m-%d %H:%M:%S') if self.creation_time else None,'valid_status': self.valid_status}

代码解释:

这段代码是一个短链接生成服务的实现,主要由三部分组成:随机字符串生成函数、唯一随机组合生成函数、创建短链接的函数,以及一个数据库模型定义。以下是对每个部分的详细解释:

1. 随机字符串生成函数 (generate_random_string)

这个函数的目的是生成一个指定长度(默认为5个字符)的随机字符串,这个字符串由大写英文字母和数字组成。具体实现方式如下:

  • characters变量通过连接string.ascii_uppercase(所有大写字母)和string.digits(所有数字,即0-9)得到一个包含所有大写字母和数字的字符串。
  • 使用列表推导式和random.choice(characters)在上述字符集中随机选择字符,生成指定长度的字符串。这里_是一个惯用的占位符,表示循环变量在循环体中不会被使用。
  • return ''.join(...)将列表推导式生成的字符列表连接成一个字符串并返回。

2. 唯一随机组合生成函数 (generate_unique_combination)

该函数确保生成的随机字符串在数据库中是唯一的,避免与已存在的短链接冲突。具体流程如下:

  • 使用while True创建一个无限循环,不断尝试生成新的随机字符串,直到找到一个在数据库中不存在的字符串。
  • existing_record = XUrlLink.query.filter_by(random_characters=random_string).first()尝试在XUrlLink表中查询是否存在当前生成的随机字符串。如果查询结果为None(即existing_recordFalse),说明生成的字符串在数据库中是唯一的。
  • 如果生成的随机字符串唯一,则通过return random_string返回这个字符串并退出循环。

3. 创建短链接的函数 (create_short_link_func)

此函数用于根据给定的原始链接和管理员ID创建一个短链接记录:

  • random_string = generate_unique_combination()调用上述函数生成一个唯一的随机字符串。
  • 创建一个XUrlLink实例,使用提供的原始链接、生成的随机字符串和管理员ID作为参数初始化。
  • 通过db.session.add(new_log)将新记录添加到数据库会话中,然后通过db.session.commit()提交会话,将记录永久保存到数据库中。

4. 数据库模型 (XUrlLink)

XUrlLink类定义了数据库中用于存储短链接信息的表结构:

  • 包含字段如id(主键,自增)、url_link(原始链接)、random_characters(生成的随机字符串,用作短链接的唯一标识)、creator_id(创建者ID)、creation_time(创建时间,默认为当前时间)、valid_status(有效状态,默认为"有效")。
  • to_dict方法用于将记录的信息转换为字典格式,便于后续处理或将数据返回给客户端。

整体上,这段代码展示了如何在Flask应用中实现一个简单的短链接生成服务,包括生成短链接的唯一标识、保存短链接信息到数据库、以及定义用于操作这些信息的模型。

2、使用短链、记录短链使用记录

#学习交流 访问
# https://v.iiar.cn@app.route('/<random_string>')
def query_and_respond(random_string):result = f"查询结果为: {random_string}"url_info = XUrlLink.query.filter_by(random_characters=random_string).first()if url_info:user_agent = request.headers.get('User-Agent')user_agent_parsed = parse(user_agent)ip_address = request.remote_addrurl_accessed = request.urldevice_info = {'ip_address': ip_address,'url_accessed': url_accessed,'is_mobile': user_agent_parsed.is_mobile,'is_tablet': user_agent_parsed.is_tablet,'is_touch_capable': user_agent_parsed.is_touch_capable,'is_pc': user_agent_parsed.is_pc,'is_bot': user_agent_parsed.is_bot,'browser': user_agent_parsed.browser.family,'browser_version': user_agent_parsed.browser.version_string,'os': user_agent_parsed.os.family,'os_version': user_agent_parsed.os.version_string,'device': user_agent_parsed.device.family}# 记录或处理获取到的信息# print(ip_address, url_accessed, device_info)new_log = XOpenUrlLog(random_characters=random_string,user_agent=json.dumps(device_info))db.session.add(new_log)db.session.commit()# return device_infopay_url = url_info.url_linkreturn redirect(pay_url, code=301)# url不存在,跳转引导页no_url = '不存在的短链'return no_url# 访问url的记录模型
class XOpenUrlLog(db.Model):id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='主键ID')random_characters = db.Column(db.String(100), comment='随机字符')user_agent = db.Column(db.Text, comment='随机字符')creation_time = db.Column(db.DateTime, default=datetime.now, comment='创建时间')def to_dict(self):return {'id': self.id,'random_characters': self.random_characters,'user_agent': self.user_agent,'creation_time': self.creation_time.strftime('%Y-%m-%d %H:%M:%S') if self.creation_time else None}

记录内容大概如下:
在这里插入图片描述

代码解释:

这段代码是Flask框架中的一个路由处理函数,用于处理对任意短链接(通过<random_string>指定)的访问请求,并记录访问者的设备信息,最后将用户重定向到与短链接关联的原始URL。此外,还定义了一个用于记录访问信息的数据库模型XOpenUrlLog。下面是对代码的具体解释:

路由处理函数 (query_and_respond)

  • @app.route('/<random_string>')装饰器定义了一个动态路由,random_string是动态部分,代表访问的短链接标识。
  • 函数首先尝试在XUrlLink数据库表中查找random_characters字段匹配random_string的记录。如果找到,表示短链接有效。
  • 使用request.headers.get('User-Agent')获取用户代理字符串,然后使用user_agents库的parse函数解析这个字符串,获取关于访问者设备的详细信息。
  • 收集访问者的IP地址(request.remote_addr)和访问的完整URL(request.url)。
  • 创建一个字典device_info,包含解析后的设备信息,如是否为移动设备、操作系统、浏览器类型等。
  • 实例化XOpenUrlLog模型,记录随机字符和序列化后的用户代理信息(json.dumps(device_info)),然后将这条记录添加到数据库并提交。
  • 如果找到对应的短链接记录,将用户重定向到记录中的url_link指定的原始URL(使用redirect函数)。
  • 如果未找到短链接记录,返回一个错误消息(“不存在的短链”)。

访问URL的记录模型 (XOpenUrlLog)

  • 定义了一个数据库模型XOpenUrlLog,用于记录每次短链接被访问时的信息。
  • 模型字段包括:
    • id:记录的唯一标识,主键。
    • random_characters:访问的短链接标识。
    • user_agent:访问者的设备信息,存储为文本。
    • creation_time:记录创建的时间,默认为当前时间。
  • to_dict方法用于将记录的信息转换为字典格式,通常用于数据的序列化或API响应。

这段代码实现的功能包括解析和记录访问者的设备信息,以及处理短链接的重定向逻辑,同时通过XOpenUrlLog模型记录每次访问的详细信息,这些信息可用于后续的数据分析和监控。

查看短链使用情况,就需要各位自己根据需要的数据去分析了,如果对这个功能感兴趣欢迎一起交流学习

#学习交流 访问
# https://v.iiar.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/687610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【c++设计模式03】创建型1:简单工厂模式(Simple Factory Pattern)

【c设计模式03】创建型1&#xff1a;简单工厂模式&#xff08;Simple Factory Pattern&#xff09; 一、工厂模式二、简单工厂模式三、UML类图四、demo五、使用多态的简单工厂模式1、UML类图——使用多态2、demo——使用多态 原创作者&#xff1a;郑同学的笔记 原创地址&#x…

GAN:“左右互搏”的卷积网络,不断优化性能中

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 在一个名为“卷王”的世界里&#xff0c;有一个传奇般的存在——生成对抗网络&#xff…

解释器设计模式

解释器设计模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种语言的文法&#xff0c;并建立一个解释器来解释该语言中的句子。这种模式通常用于需要解释或执行一种特定类型的语言的场景&#xff0c;例如编程语言的编译器或解释器、…

17. 【Linux教程】查看文件内容

前面小节介绍了文件和目录相关的操作&#xff0c;本小节介绍如何使用 file、cat、more、tail 命令在不同场景下去查看文件相关信息和内容。 1. file 查看文件类型 file 命令可以用来查看文件类型&#xff0c;还能查看文件的编码格式&#xff0c;下面列举一些 file 命令的参数&…

文件上传漏洞--Upload-labs--Pass04--.htaccess绕过

一、什么是 .htaccess 文件 1、官方解释&#xff1a; .htaccess文件主要用于控制Web服务器&#xff08;如Apache&#xff09;的配置&#xff0c;使得无需修改主服务器配置文件即可对特定目录进行访问控制和功能设置。 2、通俗解释&#xff1a; 现有一份 写有恶意代码的 .ph…

[力扣 Hot100]Day28 两数相加

题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都…

计算机网络-数据通信基础

目录 前言 一、数据通信基本概念 二、数据通信相关知识1 总结 前言 正在学习计算机网络体系&#xff0c;把每日所学的知识梳理出来&#xff0c;既能够当作读书笔记&#xff0c;又能分享出来和大家一同学习讨论。 一、数据通信基本概念 基本概念&#xff1a;信源、信道、信宿&…

【LeetCode: 589. N 叉树的前序遍历 + DFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

NBA2K24 精品蔡徐坤面补

NBA2K24 精品蔡徐坤面补 NBA2K23-NBA2K24通用 精品蔡徐坤面补 下载地址&#xff1a; https://www.changyouzuhao.cn/13072.html

找座位 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 在一个大型体育场内举办了一场大型活动&#xff0c;由于疫情防控的需要&#xff0c;要求每位观众的必须间隔至少一个空位才允许落座。 现在给出一排观众座位分布…

Nginx 正向代理、反向代理

文章目录 前言1. 正向代理1.1 概念1.2 逻辑图1.3 使用场景 2. 反向代理2.1 概念2.2 逻辑图2.3 使用场景 前言 正向代理主要是用来解决访问限制问题&#xff1b;反向代理则是提供负载均衡、安全防护等作用 1. 正向代理 1.1 概念 正向代理是一个位于客户端和目标服务器之间的代理…

入门OpenCV:图像阈值处理

基本概念 图像阈值是一种简单、高效的图像分割方法&#xff0c;目的是将图像转换成二值图像。这个过程涉及比较像素值和阈值&#xff0c;根据比较结果来确定每个像素点的状态&#xff08;前景或背景&#xff09;。图像阈值在处理二维码、文本识别、物体跟踪等领域中非常有用。…

数据结构第十六天(二叉树层序遍历/广度优先搜索(BFS)/队列使用)

目录 前言 概述 接口 源码 测试函数 运行结果 往期精彩内容 前言 从前的日色变得慢&#xff0c;车&#xff0c;马&#xff0c;邮件都慢&#xff0c;一生,只够爱一个人。 概述 二叉树的层序遍历可以使用广度优先搜索&#xff08;BFS&#xff09;来实现。具体步骤如下&…

LiveGBS流媒体平台GB/T28181常见问题-基础配置流媒体服务配置中本地|内网IP外网IP(可选)外网IP收流如何配置

LiveGBS常见问题基础配置流媒体服务配置中本地|内网IP外网IP外网IP收流如何配置&#xff1f; 1、流媒体服务配置2、播放提示none rtp data receive3、多网卡服务器4、收流端口配置5、端口区间可以如何配置6、搭建GB28181视频直播平台 1、流媒体服务配置 LiveGBS中基础配置-》流…

多线程---创建线程

1.概述 多线程是指从软件或者硬件上实现多个线程并发执行的技术。线程是程序中独立运行的程序片段&#xff0c;每个线程都有独立的执行流程&#xff0c;可以在同一时间内执行不同的任务。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程&#xff0c;进而提…

反编译调试C#编写的exe软件和dll方法详解

1.首先需要下载软件dnSpy.exe&#xff0c;下载地址&#xff1a;https://github.com/dnSpy/dnSpy/releases/tag/v6.1.8 2.使用方法&#xff1a; 首先打开项目&#xff0c;我们这里可以选择dll&#xff0c;也可以选择exe 这边我们是打开了一个WPF写的客户端软件。 2.打开后我…

不同品牌和种类的电容与电感实测对比(D值、Q值、ESR、X)

最近买了个LCR电桥&#xff0c;就想测一下手头上的各种电容电感的参数&#xff0c;对比一下。 测试设备是中创ET4410&#xff0c;测量的参数有&#xff1a;电容值、电感值、D(损耗角正切值)、Q(品质因数)、ESR(等效串联电阻)、X(电抗&#xff0c;通常表示为感抗XL或容抗XC)。 …

使用 LangChain+大模型,基于文本数据构建知识图谱

大家好&#xff01;在本篇博客中&#xff0c;我将带领大家学习知识图谱以及如何利用大模型和自己的文本数据构建一个。 喜欢本文记得收藏、关注、点赞。 什么是知识图谱&#xff1f; 知识图谱&#xff0c;也被称为语义图&#xff0c;是一种智能结构&#xff0c;以高效的方式…

【打工日常】使用docker部署Dashdot工具箱

一、Dashdot介绍 dashdot是一个简洁清晰的服务器数据仪表板&#xff0c;基于React实现 &#xff0c;主要是显示操作系统、进程、存储、内存、网络这五个的数据。 二、本次实践介绍 1. 本次实践简介 本次实践部署环境为个人测试环境 2. 本地环境规划 本次实践环境规划&#xf…

PyCharm 自动缩进代码 (Auto-Indent Lines)

PyCharm 自动缩进代码 [Auto-Indent Lines] 1. Ctrl A2. Code -> Auto-Indent LinesReferences 1. Ctrl A 全选代码。 2. Code -> Auto-Indent Lines 自动缩进快捷键 Ctrl Alt I。 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/