• 深入解析域名短链接生成原理及其在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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    代码解释:

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

    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('/')
    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_addr
            url_accessed = request.url
    
            device_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_info
            pay_url = url_info.url_link
            return 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
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

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

    代码解释:

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

    路由处理函数 (query_and_respond)

    • @app.route('/')装饰器定义了一个动态路由,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
    
    • 1
    • 2
  • 相关阅读:
    汇编语言实验4:分支程序题目设计
    SpringBoot集成grpc实现微服务
    算法day38|509,70,746
    电磁兼容——电子系统的EMC要求
    自动化测试
    LeetCode 567. 字符串的排列
    【LeetCode刷题-双指针】--977.有序数组的平方
    SpringBoot 官网翻译
    vue+cesium 点击矢量图层获取geoserver信息
    Redis数据库安全加固
  • 原文地址:https://blog.csdn.net/weixin_40541330/article/details/136142142