使用 Python 開發(fā)一個(gè)【短鏈接生成器】
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
是不是很長(zhǎng)?

鏈接太長(zhǎng)分享太煩
如何把鏈接變短?網(wǎng)上有挺多類似的服務(wù)的
比如新浪的短網(wǎng)址我們將剛剛的長(zhǎng)鏈接壓縮一下就變成這樣了

通過瀏覽器訪問得到的結(jié)果居然是一模一樣的
http://dwz.date/aEjn怎么突然就變得這么短?

我們來抓一下包看看它到底做了些什么
訪問下這個(gè)生成的短鏈接

可以看到在請(qǐng)求短鏈接的時(shí)候
首先是指向 dwz.date 這個(gè)服務(wù)器的
而我們向這個(gè)服務(wù)器進(jìn)行 GET 請(qǐng)求的時(shí)候它做了 301 重定向

而重定向的地址
就是我們壓縮前的長(zhǎng)鏈接

可想而知短鏈接中的?aEjn?和原來的長(zhǎng)鏈接背后應(yīng)該做著偷雞摸狗的事情才可以做到這樣

那么現(xiàn)在
思路就有了畫個(gè)帥b圖

帥帥的服務(wù)接收一個(gè)長(zhǎng)鏈接
將長(zhǎng)鏈接 “加密” 生成短字符
接著在數(shù)據(jù)庫(kù)中
插入一條記錄
這條記錄將原本的長(zhǎng)鏈接和壓縮后的字符關(guān)聯(lián)起來
那么當(dāng)用戶下次訪問的時(shí)候就是這樣

用戶拿著短鏈接去請(qǐng)求服務(wù)器服務(wù)器根據(jù) “加密” 后的字符去數(shù)據(jù)庫(kù)查找
找到原始鏈接后直接幫用戶重定向訪問原始鏈接

像這種進(jìn)去的時(shí)候是長(zhǎng)的
出來的時(shí)候是短的功能
如何用 Python 實(shí)現(xiàn)呢
接下來就是學(xué)習(xí) Python 的正確姿勢(shì)

首先創(chuàng)建一個(gè) shorturl 文件夾在 shorturl 中創(chuàng)建 templates 來存放 HTML

先來創(chuàng)建下 HTML 吧
主要是一個(gè)輸入框和確認(rèn)按鈕

用了下?bootstrap效果是這樣滴

“短就完事了”

接著回到 shorturl 中創(chuàng)建 py

先導(dǎo)入 Flask 相關(guān)的庫(kù)
然后讓它請(qǐng)求根目錄的時(shí)候返回我們剛剛寫的 HTML

運(yùn)行一波

默認(rèn)運(yùn)行在 5000 端口上
在瀏覽器中訪問
http://127.0.0.1:5000/

可以運(yùn)行到說明環(huán)境沒問題

當(dāng)用戶點(diǎn)擊生成按鈕的時(shí)候后端需要把長(zhǎng)鏈接的內(nèi)容給拿過來
那么需要在 HTML 中定義一下?form 表單以及 input 中的屬性

這里我們定義一個(gè) form
POST 請(qǐng)求指定請(qǐng)求?gen_short_url其中 input 的 name 定義了 long-url
這樣我們就可以在 Flask 中定義 POST 方法接收長(zhǎng)鏈接的內(nèi)容了

得到長(zhǎng)鏈接之后就可以壓縮長(zhǎng)鏈接
然后返回短鏈接的
先假設(shè)返回的短鏈接還是 long-url指定下 short_url 變量在 HTML?中回顯一下

回到 HTML 中
判斷一下 short_url 是否存在存在就顯示短鏈接

運(yùn)行一波

ok
回顯成功說明參數(shù)之間的對(duì)接沒有問題
那么接下就是用 Python 來寫一下
把長(zhǎng)鏈接 “縮短” 了
怎么縮呢?
首先每次點(diǎn)擊生成新的長(zhǎng)鏈接的時(shí)候我們都需要將它插入到數(shù)據(jù)庫(kù)中
那么每插一次就會(huì)有一個(gè)與長(zhǎng)鏈接關(guān)聯(lián)的唯一的 id
下次訪問的時(shí)候通過 id 就可以直接找到原始的鏈接
比如
一個(gè)長(zhǎng)鏈接
"https://www.goooooooooooooooooooooooooooooooooooooooooooooooooooooooooogle.com"
插入到數(shù)據(jù)庫(kù)中
| id | longURL |
| 1 | https://www.gooo...le.com |
那么要生成的短鏈接地址就是
127.0.0.1:5000/1
下次通過這個(gè)鏈接訪問服務(wù)器的時(shí)候
我們通過 1 就可以找到長(zhǎng)鏈接
然后重定向就可以了

不過
如果插入了上千萬(wàn)甚至上億條數(shù)據(jù)呢短鏈接有可能變成這樣
127.0.0.1:5000/10000000000000000000000000000000000...
那后面生成的豈不是比長(zhǎng)鏈接還長(zhǎng)

這時(shí)候你可能想到了
把 id 這整數(shù)轉(zhuǎn)化成 16 進(jìn)制的怎么樣
不過 16 進(jìn)制并不能縮短多少
要不整下 62 進(jìn)制試試

像這樣

可以可以
那么我們就在 mysql 中創(chuàng)建一張表
就用來放長(zhǎng)鏈接

其中 id 設(shè)為自增長(zhǎng)url 用來存放長(zhǎng)鏈接
接著在 application.py 中連接 mysql

接著我們?cè)谟脩粽?qǐng)求生成短鏈接的時(shí)候?也就是在 gen_short_url 中將獲取到的長(zhǎng)鏈接塞到剛剛創(chuàng)建的表里面

這樣插入之后就可以獲取長(zhǎng)鏈接對(duì)應(yīng)的自增 id
我們將這個(gè) id?轉(zhuǎn)化為 62 進(jìn)制縮短之后就可以拼接成短網(wǎng)址了

運(yùn)行一波

可以看到
它縮短了
因?yàn)?1 的 62 進(jìn)制還是 1結(jié)果看起來不是很明顯
我們假設(shè)插入 100000 條數(shù)據(jù)試試把數(shù)據(jù)表的自增 id 改為 100000 開始

再運(yùn)行一波

ok有內(nèi)味了
接下來要做一個(gè)重定向當(dāng)用戶使用短鏈接向我們服務(wù)請(qǐng)求的時(shí)候我們獲取這個(gè)短鏈接的數(shù)據(jù)然后去數(shù)據(jù)庫(kù)查詢后跳轉(zhuǎn)
創(chuàng)建一個(gè)重定向方法通過 /

拿到了原始 id 之后
就可以到數(shù)據(jù)庫(kù)查詢了
獲取到長(zhǎng)鏈接然后重定向過去

通過 Flask 的 redirect 方法
就可以直接做重定向了
當(dāng)然
最好還是加下 try

運(yùn)行一波

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

ok
思路差不多就是這樣啦如果你有自己的服務(wù)器也可以部署上去玩玩

這樣別人通過你的 IP或者你解析的域名就能訪問到啦

以上完整代碼已上傳在公眾后后臺(tái)發(fā)送 3 獲取我們下回見,peace
太愛我的話就加我微信備注 “讀者” 即可通過
猜你還想看:用 Python 開發(fā)一個(gè)微信留言小程序
用 Python 開發(fā)【視頻營(yíng)銷號(hào)】生成器用 Python 開發(fā)一個(gè)沙雕
評(píng)論
圖片
表情
