使用 Python 开发一个【短链接生成器】

学习python的正确姿势

共 2382字,需浏览 5分钟

 ·

2020-05-20 00:07




我们总会遇到类似这样的链接



https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1589795467819&di=15043ebd2ae7b0a2eac634de991e45af&imgtype=0&src=http%3A%2F%2Fe.hiphotos.baidu.com%2Fzhidao%2Fpic%2Fitem%2F42a98226cffc1e174eec8bf14190f603728de99b.jpg




是不是很长?


85ddeec6161842e57178c33ddfd5b573.webp


链接太长分享太烦
如何把链接变短?网上有挺多类似的服务的
比如新浪的短网址我们将刚刚的长链接压缩一下就变成这样了


6827ce9ff3d4605102aab00c77d6a4f1.webp




通过浏览器访问得到的结果居然是一模一样的
http://dwz.date/aEjn怎么突然就变得这么短?


fb283453ef220097459d95ff477e96ff.webp


我们来抓一下包看看它到底做了些什么

访问下这个生成的短链接


256bc8d096b65f45c2a10b3fec2aecbb.webp




可以看到在请求短链接的时候
首先是指向 dwz.date 这个服务器的

而我们向这个服务器进行 GET 请求的时候它做了 301 重定向



1f3d78d43253b0daf464b36603b1d76c.webp




而重定向的地址
就是我们压缩前的长链接


704e88ee16e1d8990bae583a393310cb.webp




可想而知短链接中的 aEjn 和原来的长链接背后应该做着偷鸡摸狗的事情才可以做到这样


f085227264d32e399d5c2950aa11a9fb.webp


那么现在
思路就有了画个帅b图


5c32d197d21110b0e25a235ac8e94993.webp




帅帅的服务接收一个长链接
将长链接 “加密” 生成短字符

接着在数据库中
插入一条记录
这条记录将原本的长链接和压缩后的字符关联起来
那么当用户下次访问的时候就是这样


1a6b7578332bb131f28f3fc7dc2be20c.webp




用户拿着短链接去请求服务器服务器根据 “加密” 后的字符去数据库查找
找到原始链接后直接帮用户重定向访问原始链接



d96dac45d9b61328cb58900cce5c9f2f.webp



像这种进去的时候是长的
出来的时候是短的功能
如何用 Python 实现呢
接下来就是学习 Python 的正确姿势

fb48cd966d7b532864e9f12abd74497d.webp





首先创建一个 shorturl 文件夹在 shorturl 中创建 templates 来存放 HTML


1f54ee2d85b44b415a619ee197ae46a4.webp




先来创建下 HTML 吧
主要是一个输入框和确认按钮


80b2e4976df2c3794e6d0f83a1a76dc1.webp




用了下 bootstrap效果是这样滴


04094ea99c654d6b05af3e7f3d8cbae8.webp




“短就完事了”



e2ae5c60e020431cde7a6cc63020ae15.webp


接着回到 shorturl 中创建 py



4424f5f576c2bb1e6325d5b8391b6203.webp




先导入 Flask 相关的库
然后让它请求根目录的时候返回我们刚刚写的 HTML


e684a1b2b0349adbb95dae7ada78bf76.webp




运行一波



8f5af483c192da27e06882292df5f20a.webp




默认运行在 5000 端口上
在浏览器中访问
http://127.0.0.1:5000/


e3fdef5d05bf4a9e420274e5b536ecb2.webp




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


f73f76bc14df05429993dcfe77c13fa5.webp


当用户点击生成按钮的时候后端需要把长链接的内容给拿过来
那么需要在 HTML 中定义一下 form 表单以及 input 中的属性


099ab0410b0a6084d626fac0fa53b792.webp




这里我们定义一个 form
POST 请求指定请求 gen_short_url其中 input 的 name 定义了 long-url

这样我们就可以在 Flask 中定义 POST 方法接收长链接的内容了


67b101e2feb3a6884ece051416f4495c.webp



得到长链接之后就可以压缩长链接
然后返回短链接的
先假设返回的短链接还是 long-url指定下 short_url 变量在 HTML 中回显一下


dea68baa3628ee0ce8655864e30d179d.webp




回到 HTML 中
判断一下 short_url 是否存在存在就显示短链接


3dd954e1041dbe5cabf49f41c1324617.webp




运行一波



819978825f18300154325faa08dc09bb.webp




ok
回显成功说明参数之间的对接没有问题
那么接下就是用 Python 来写一下
把长链接 “缩短” 了

怎么缩呢?

首先每次点击生成新的长链接的时候我们都需要将它插入到数据库中
那么每插一次就会有一个与长链接关联的唯一的 id
下次访问的时候通过 id 就可以直接找到原始的链接


比如

一个长链接
"https://www.goooooooooooooooooooooooooooooooooooooooooooooooooooooooooogle.com"

插入到数据库中

id
longURL
1
https://www.gooo...le.com


那么要生成的短链接地址就是
127.0.0.1:5000/1

下次通过这个链接访问服务器的时候
我们通过 1 就可以找到长链接
然后重定向就可以了


f6a3eaa9bd6190414b6e33116c074811.webp


不过
如果插入了上千万甚至上亿条数据呢短链接有可能变成这样

127.0.0.1:5000/10000000000000000000000000000000000...
那后面生成的岂不是比长链接还长



9c728c8d934f0b92aa18aeb92f26c896.webp


这时候你可能想到了
把 id 这整数转化成 16 进制的怎么样
不过 16 进制并不能缩短多少
要不整下 62 进制试试



b1f924824d1e68af40498ac2bed99264.webp



像这样



52021552d82657c9f6336d041400a8d3.webp



可以可以


那么我们就在 mysql 中创建一张表
就用来放长链接


ac74edf98de62c36afdbc88860161025.webp



其中 id 设为自增长url 用来存放长链接
接着在 application.py 中连接 mysql



285d1cacbf299581907437269625e267.webp




接着我们在用户请求生成短链接的时候 也就是在 gen_short_url 中将获取到的长链接塞到刚刚创建的表里面


039cd3cb0a0a7d1122a12515337cf423.webp




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

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


c977d27ff01842211c4adb6d862d5dea.webp



运行一波



6192e8b45d76f53964190b9782bc539a.webp




可以看到
它缩短了
因为 1 的 62 进制还是 1结果看起来不是很明显
我们假设插入 100000 条数据试试把数据表的自增 id 改为 100000 开始


6fd59b2d78efdeaaa1b802fa8122df1e.webp




再运行一波


eb5f5bbdf4408fccec0354e4b1c149b2.webp




ok有内味了
接下来要做一个重定向当用户使用短链接向我们服务请求的时候我们获取这个短链接的数据然后去数据库查询后跳转

创建一个重定向方法通过 /来接收请求的短链接参数然后把它转化为数据库的 id


8a647d011762ed2923fb426b6b7ab0e3.webp




拿到了原始 id 之后
就可以到数据库查询了
获取到长链接然后重定向过去


e81badf4edf4480e94a477c76bc0a081.webp



通过 Flask 的 redirect 方法
就可以直接做重定向了

当然
最好还是加下 try


8e896a3fc180aa9ef3f50f2155eefc43.webp




运行一波


5aee5af4b34c663665852134d5a445d6.webp






怎么回事?刚闪了一下好像看到了我的身影?


f63608f26dfdee9dbe9008adfd4a3aa5.webp


ok
思路差不多就是这样啦如果你有自己的服务器也可以部署上去玩玩


65de5161f1fb92729c565ccd7cd1be3d.webp



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


689de81ef470abebd5f3ffdff62dc8bd.webp




以上完整代码已上传在公众后后台发送 3 获取我们下回见,peace

太爱我的话就加我微信备注 “读者” 即可通过




猜你还想看:用 Python 开发一个微信留言小程序
用 Python 开发【视频营销号】生成器用 Python 开发一个沙雕


浏览 32
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报