深入解析域名短链接生成原理及其在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.hqwc.cn/news/473761.html

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

相关文章

Mysql知识点汇总

Mysql知识点汇总 1. Mysql基本场景的简单语句。2. Mysql的增删改查&#xff0c;统计表中的成绩最好的两个同学的名字&#xff0c;年级等。3&#xff1a;请使用多种方法查询每个学生的每门课分数>80的学生姓名4、order by&#xff0c;group by&#xff0c;子查询4.1、having和…

基于PPNSA+扰动算子的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于PPNSA扰动算子的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图和优化收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行…

[嵌入式系统-27]:RT-Thread -14- 操作系统配置:rtconfig.h文件与menuconfig命令

目录 一、rtconfig.h 1.1 概述 1.2 软硬件资源配置 1.3 功能模块选择 1.4 内核配置详解 1.5 调度器配置 1.6 硬件设备驱动配置 1.7 网络配置 1.8 调试配置 二、menuconfig 2.1 概述 2.2 主要功能 三、RT Thread配置 VS Linux配置 一、rtconfig.h 1.1 概述 rtco…

【NI-DAQmx入门】数据采集中的降噪技术

1.什么是噪声&#xff1f; 噪声是电路中存在的与期望信号不同的任何电信号 噪声可以降低&#xff0c;但不能消除 噪声可以在源头处被抑制 通过耦合可以降低数据传输通道的噪声 2.噪声耦合方法 导电性 电容性 感应性 其他 3.传导耦合噪声 来自不同电路的电流在一个公共阻抗中共…

DDD爱好者通病-《软件方法》自测题解析37

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《软件方法》第5章自测题2 5 [ 单选题 ] 我们经常会听到有人说“系统分为几个功能模块”。针对“功能模块”&#xff0c;以下说法正确的是&#xff1a;  A) 它把外部和内部混在一…

前端小案例——购买电影票(HTML+CSS+JS, 附源码)

一、前言 实现功能&#xff1a; 这段代码实现了一个简单的电影票选座购买的功能界面。 在页面上展示了一个电影院的座位布局&#xff0c;以及右侧显示了电影信息、选座情况、票价、总计等内容。 用户可以通过点击座位来选择购买电影票&#xff0c;每个座位的状态会在点击时改…

详解自定义类型:枚举与联合体!

目录 ​编辑 一、枚举类型 1.枚举类型的声明 2.枚举类型的优点 3.枚举类型的使用 二、联合体类型(共用体&#xff09; 1.联合体类型的声明 2.联合体的特点 3.相同成员的结构体和联合体的对比 4.联合体大小的计算 5.用联合体判断大小端 三.完结散花 悟已往之不谏&…

5年前端老司机:浅谈web前端开发技术点

有部分同学和朋友问到过我相关问题。利用周末我就浅浅地谈谈我对web前端开发的理解和体会&#xff0c;仅仅能浅浅谈谈&#xff0c;高手请自己主动跳过本篇文章。 毕竟我如今经验并非非常足&#xff0c;连project师都算不上&#xff0c;更不用说大牛了。今天也不谈技术。技术非…

给定n个结点m条边的简单无向图,判断该图是否存在鱼形状的子图:有一个环,其中有一个结点有另外两条边,连向不在环内的两个结点。若有,输出子图的连边

题目 思路: #include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn = 1e6 + 5, inf = 1e18 * 3, maxm = 4e4 + 5,…

OpenAI Sora技术报告[中文版] - 视频生成模型:构建虚拟世界的模拟器

OpenAI近日发布了震撼视频生成产品Sora&#xff0c;生成效果非常炸裂。 以下是提示词的生成&#xff1a; 在一个装饰华丽的历史大厅里&#xff0c;一道巨大的海浪正准备冲击而来。两位冲浪者抓住机会&#xff0c;巧妙地驾驭着海浪。 OpenAI使用了视觉数据的补片技术转化&#…

图表示学习 Graph Representation Learning chapter2 背景知识和传统方法

图表示学习 Graph Representation Learning chapter2 背景知识和传统方法 2.1 图统计和核方法2.1.1 节点层次的统计和特征节点的度 节点中心度聚类系数Closed Triangles, Ego Graphs, and Motifs 图层次的特征和图的核节点袋Weisfieler–Lehman核Graphlets和基于路径的方法 邻域…

Stable Diffusion 模型下载:Beautiful Realistic Asians(美丽真实的亚洲人)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 Beautiful Realistic Asians&#xff08;BRA&#xff09;模型是由作者自己训练…