python 链接池 设置 python如何生成链接_短链接


链接太长分享太烦

如何把链接变短?

网上有挺多类似的服务的

比如新浪的短网址

我们将刚刚的长链接压缩一下就变成这样了


python 链接池 设置 python如何生成链接_长链接_02


通过浏览器访问得到的结果

居然是一模一样的

http://dwz.date/aEjn

怎么突然就变得这么短?


python 链接池 设置 python如何生成链接_长链接_03


我们来抓一下包

看看它到底做了些什么

访问下这个生成的短链接


python 链接池 设置 python如何生成链接_长链接_04


可以看到在请求短链接的时候

首先是指向 dwz.date 这个服务器的

而我们向这个服务器进行 GET 请求的时候

它做了 301 重定向


python 链接池 设置 python如何生成链接_短链接_05


而重定向的地址

就是我们压缩前的长链接


python 链接池 设置 python如何生成链接_重定向_06


可想而知

短链接中的 aEjn 和原来的长链接背后应该做着偷鸡摸狗的事情

才可以做到这样


python 链接池 设置 python如何生成链接_重定向_07


那么现在

思路就有了画个帅b图


python 链接池 设置 python如何生成链接_python 链接池 设置_08


帅帅的服务接收一个长链接

将长链接 “加密” 生成短字符

接着在数据库中

插入一条记录

这条记录将原本的长链接和压缩后的字符关联起来

那么当用户下次访问的时候就是这样


python 链接池 设置 python如何生成链接_python 链接池 设置_09


用户拿着短链接去请求服务器服务器

根据 “加密” 后的字符去数据库查找

找到原始链接后直接帮用户重定向访问原始链接


python 链接池 设置 python如何生成链接_python 链接池 设置_10


像这种进去的时候是长的

出来的时候是短的功能

如何用 Python 实现呢

接下来就是学习 Python 的正确姿势


python 链接池 设置 python如何生成链接_短链接_11


首先创建一个 shorturl 文件夹

在 shorturl 中创建 templates 来存放 HTML


python 链接池 设置 python如何生成链接_重定向_12


先来创建下 HTML 吧

主要是一个输入框和确认按钮


python 链接池 设置 python如何生成链接_python 链接池 设置_13


用了下 bootstrap效果是这样滴


python 链接池 设置 python如何生成链接_短链接_14


“短就完事了”


python 链接池 设置 python如何生成链接_重定向_15


接着回到 shorturl 中创建 py


python 链接池 设置 python如何生成链接_python 链接池 设置_16


先导入 Flask 相关的库

然后让它请求根目录的时候返回我们刚刚写的 HTML


python 链接池 设置 python如何生成链接_python 链接池 设置_17


运行一波


python 链接池 设置 python如何生成链接_python 链接池 设置_18


默认运行在 5000 端口上

在浏览器中访问

http://127.0.0.1:5000/


python 链接池 设置 python如何生成链接_长链接_19


可以运行到说明环境没问题


python 链接池 设置 python如何生成链接_5怎么生成短链接_20


当用户点击生成按钮的时候

后端需要把长链接的内容给拿过来

那么需要在 HTML 中定义一下 form 表单以及 input 中的属性


python 链接池 设置 python如何生成链接_长链接_21


这里我们定义一个 form

POST 请求指定请求 gen_short_url

其中 input 的 name 定义了 long-url

这样我们就可以在 Flask 中定义 POST 方法

接收长链接的内容了


python 链接池 设置 python如何生成链接_重定向_22


得到长链接之后就可以压缩长链接

然后返回短链接了

先假设返回的短链接还是 long-url

指定下 short_url 变量在 HTML 中回显一下


python 链接池 设置 python如何生成链接_python 链接池 设置_23


回到 HTML 中

判断一下 short_url 是否存在

存在就显示短链接


python 链接池 设置 python如何生成链接_短链接_24


运行一波


python 链接池 设置 python如何生成链接_短链接_25


ok

回显成功说明参数之间的对接没有问题

那么接下就是用 Python 来写一下

把长链接 “缩短” 了

怎么缩呢?

首先每次点击生成新的长链接的时候

我们都需要将它插入到数据库中

那么每插一次就会有一个与长链接关联的唯一的 id

下次访问的时候通过 id 就可以直接找到原始的链接

比如

一个长链接

"https://"

插入到数据库中

id longURL

--- --------------------------------------

1 https://www.gooo...http://

那么要生成的短链接地址就是

127.0.0.1:5000/1

下次通过这个链接访问服务器的时候

我们通过 1 就可以找到长链接

然后重定向就可以了


python 链接池 设置 python如何生成链接_长链接_26


不过

如果插入了上千万甚至上亿条数据呢

短链接有可能变成这样

127.0.0.1:5000/10000000000000000000000000000000000...

那后面生成的岂不是比长链接还长


python 链接池 设置 python如何生成链接_重定向_27


这时候你可能想到了

把 id 这整数转化成 16 进制的怎么样

不过 16 进制并不能缩短多少

要不整下 62 进制试试


python 链接池 设置 python如何生成链接_长链接_28


像这样


python 链接池 设置 python如何生成链接_python 链接池 设置_29


可以可以

那么我们就在 mysql 中创建一张表

就用来放长链接


python 链接池 设置 python如何生成链接_短链接_30


其中 id 设为自增长

url 用来存放长链接

接着在 application.py 中连接 mysql


python 链接池 设置 python如何生成链接_5怎么生成短链接_31


接着我们在用户请求生成短链接的时候

也就是在 gen_short_url 中将获取到的长链接塞到刚刚创建的表里面


python 链接池 设置 python如何生成链接_短链接_32


这样插入之后就可以获取长链接对应的自增 id

我们将这个 id 转化为 62 进制缩短之后就可以拼接成短网址了


python 链接池 设置 python如何生成链接_python 链接池 设置_33


运行一波


python 链接池 设置 python如何生成链接_短链接_34


可以看到

它缩短了

因为 1 的 62 进制还是 1

结果看起来不是很明显

我们假设插入 100000 条数据试试

把数据表的自增 id 改为 100000 开始


python 链接池 设置 python如何生成链接_长链接_35


再运行一波


python 链接池 设置 python如何生成链接_5怎么生成短链接_36


ok

有内味了

接下来要做一个重定向

当用户使用短链接向我们服务请求的时候

我们获取这个短链接的数据然后去数据库查询后跳转

创建一个重定向方法

通过 /<encode_url>来接收请求的短链接参数

然后把它转化为数据库的 id


python 链接池 设置 python如何生成链接_5怎么生成短链接_37


拿到了原始 id 之后

就可以到数据库查询了

获取到长链接然后重定向过去


python 链接池 设置 python如何生成链接_长链接_38


通过 Flask 的 redirect 方法

就可以直接做重定向了

当然

最好还是加下 try


python 链接池 设置 python如何生成链接_重定向_39


运行一波


python 链接池 设置 python如何生成链接_python 链接池 设置_40


怎么回事?

刚闪了一下

好像看到了我的身影?


python 链接池 设置 python如何生成链接_重定向_41


ok

思路差不多就是这样啦

如果你有自己的服务器也可以部署上去玩玩


python 链接池 设置 python如何生成链接_python 链接池 设置_42


这样别人通过你的 IP或者你解析的域名就能访问到啦


python 链接池 设置 python如何生成链接_5怎么生成短链接_43