<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用 Python 開發(fā)一個(gè)【短鏈接生成器】

          共 2382字,需瀏覽 5分鐘

           ·

          2020-05-20 00:07




          我們總會(huì)遇到類似這樣的鏈接



          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)?


          85ddeec6161842e57178c33ddfd5b573.webp


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


          6827ce9ff3d4605102aab00c77d6a4f1.webp




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


          fb283453ef220097459d95ff477e96ff.webp


          我們來抓一下包看看它到底做了些什么

          訪問下這個(gè)生成的短鏈接


          256bc8d096b65f45c2a10b3fec2aecbb.webp




          可以看到在請(qǐng)求短鏈接的時(shí)候
          首先是指向 dwz.date 這個(gè)服務(wù)器的

          而我們向這個(gè)服務(wù)器進(jìn)行 GET 請(qǐng)求的時(shí)候它做了 301 重定向



          1f3d78d43253b0daf464b36603b1d76c.webp




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


          704e88ee16e1d8990bae583a393310cb.webp




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


          f085227264d32e399d5c2950aa11a9fb.webp


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


          5c32d197d21110b0e25a235ac8e94993.webp




          帥帥的服務(wù)接收一個(gè)長(zhǎng)鏈接
          將長(zhǎng)鏈接 “加密” 生成短字符

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


          1a6b7578332bb131f28f3fc7dc2be20c.webp




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



          d96dac45d9b61328cb58900cce5c9f2f.webp



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

          fb48cd966d7b532864e9f12abd74497d.webp





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


          1f54ee2d85b44b415a619ee197ae46a4.webp




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


          80b2e4976df2c3794e6d0f83a1a76dc1.webp




          用了下?bootstrap效果是這樣滴


          04094ea99c654d6b05af3e7f3d8cbae8.webp




          “短就完事了”



          e2ae5c60e020431cde7a6cc63020ae15.webp


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



          4424f5f576c2bb1e6325d5b8391b6203.webp




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


          e684a1b2b0349adbb95dae7ada78bf76.webp




          運(yùn)行一波



          8f5af483c192da27e06882292df5f20a.webp




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


          e3fdef5d05bf4a9e420274e5b536ecb2.webp




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


          f73f76bc14df05429993dcfe77c13fa5.webp


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


          099ab0410b0a6084d626fac0fa53b792.webp




          這里我們定義一個(gè) form
          POST 請(qǐng)求指定請(qǐng)求?gen_short_url其中 input 的 name 定義了 long-url

          這樣我們就可以在 Flask 中定義 POST 方法接收長(zhǎng)鏈接的內(nèi)容了


          67b101e2feb3a6884ece051416f4495c.webp



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


          dea68baa3628ee0ce8655864e30d179d.webp




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


          3dd954e1041dbe5cabf49f41c1324617.webp




          運(yùn)行一波



          819978825f18300154325faa08dc09bb.webp




          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)鏈接
          然后重定向就可以了


          f6a3eaa9bd6190414b6e33116c074811.webp


          不過
          如果插入了上千萬(wàn)甚至上億條數(shù)據(jù)呢短鏈接有可能變成這樣

          127.0.0.1:5000/10000000000000000000000000000000000...
          那后面生成的豈不是比長(zhǎng)鏈接還長(zhǎng)



          9c728c8d934f0b92aa18aeb92f26c896.webp


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



          b1f924824d1e68af40498ac2bed99264.webp



          像這樣



          52021552d82657c9f6336d041400a8d3.webp



          可以可以


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


          ac74edf98de62c36afdbc88860161025.webp



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



          285d1cacbf299581907437269625e267.webp




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


          039cd3cb0a0a7d1122a12515337cf423.webp




          這樣插入之后就可以獲取長(zhǎng)鏈接對(duì)應(yīng)的自增 id

          我們將這個(gè) id?轉(zhuǎn)化為 62 進(jìn)制縮短之后就可以拼接成短網(wǎng)址了


          c977d27ff01842211c4adb6d862d5dea.webp



          運(yùn)行一波



          6192e8b45d76f53964190b9782bc539a.webp




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


          6fd59b2d78efdeaaa1b802fa8122df1e.webp




          再運(yùn)行一波


          eb5f5bbdf4408fccec0354e4b1c149b2.webp




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

          創(chuàng)建一個(gè)重定向方法通過 /來接收請(qǐng)求的短鏈接參數(shù)然后把它轉(zhuǎn)化為數(shù)據(jù)庫(kù)的 id


          8a647d011762ed2923fb426b6b7ab0e3.webp




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


          e81badf4edf4480e94a477c76bc0a081.webp



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

          當(dāng)然
          最好還是加下 try


          8e896a3fc180aa9ef3f50f2155eefc43.webp




          運(yùn)行一波


          5aee5af4b34c663665852134d5a445d6.webp






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


          f63608f26dfdee9dbe9008adfd4a3aa5.webp


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


          65de5161f1fb92729c565ccd7cd1be3d.webp



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


          689de81ef470abebd5f3ffdff62dc8bd.webp




          以上完整代碼已上傳在公眾后后臺(tái)發(fā)送 3 獲取我們下回見,peace

          太愛我的話就加我微信備注 “讀者” 即可通過




          猜你還想看:用 Python 開發(fā)一個(gè)微信留言小程序
          用 Python 開發(fā)【視頻營(yíng)銷號(hào)】生成器用 Python 開發(fā)一個(gè)沙雕


          瀏覽 57
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  视频一区三区 | 免费看黃色AAAAAA 片 | 免费看欧美成人A片无码 | 全国男人的天堂网站 | 波多野吉衣无码AV |