如何使用Flask框架構建URL縮短器Web應用程序
譯文譯者 | 李睿
審校 | 重樓
51CTO讀者成長計劃社群招募,咨詢小助手(微信號:CTOjishuzhan)
隨著技術的快速發展,URL的生成可以通過URL生成器的API來創建每個URL的唯一形式。人們發現,與朋友分享長而全面的鏈接或將其作為自己工作的參考很具有挑戰性。URL縮短器可以將每個長URL的長度縮短為可以理解或掌握的較短URL。本文將學習如何使用Flask框架和Python在其機器上免費構建和運行URL縮短器。
一、什么是URL縮短器?
URL縮短器是一種工具,它可以獲取一個長而復雜的URL,并生成一個更短、更易于調用的版本。當單擊時,縮短的URL通常會重定向到原始的較長的URL。URL縮短器通常用于社交媒體帖子、電子郵件消息和其他情況,在這些情況下,短URL更方便、更容易共享。
前提
為了繼續學習這一教程,應該考慮以下幾點:
- 基本了解Python編程、HTML和CSS
- Python 3.6或更高版本
- Flask框架
- 數據庫系統,如SQLite或PostgreSQL
1.安裝Flask
要安裝Flask,需要使用Python的pip包管理器。打開命令提示符或終端,輸入下面的命令。
pip install flask
創建并運行Flask應用程序。
要創建Flask應用程序,需要創建一個Python文件app.py,并從Flask模塊導入Flask類,如下所示:
Python
1 from flask import Flask
2 app = Flask(__name__)
3
4 if __name__ == '__main__':
5
6 app.run(debug=True)
要運行應用程序或啟動服務器,請在命令提示符或終端中運行Python文件:
Python
1 python app.py
2 Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
3 Restarting with stat
4 Debugger is active!
5 Debugger PIN: 123-456-789
2.選擇數據庫系統
Flask支持多種數據庫系統,包括SQLite、MySQL、PostgreSQL等等。在這一教程中將使用SQLite,因為它是輕量級的,不需要單獨的服務器進行安裝。
3.創建數據庫模式
要開始創建數據庫模式,需要定義要使用的表和列并存儲數據。這一教程將創建一個名為URL的表,其中包含以下列、Id、original_url和short_url。將使用像SQLAlchemy這樣的對象關系映射工具。
SQL
1 CREATE TABLE urls (
2
3 id INTEGER PRIMARY KEY AUTOINCREMENT,
4
5 original_url TEXT NOT NULL,
6
7 short_url TEXT NOT NULL
8
9 );
4.連接Flask到數據庫
要配置和連接Flask數據庫,必須在Flask應用程序中配置URL并初始化數據庫對象,如下所示:
Python
1 from flask import Flask
2
3 import sqlite3
4
5
6
7 app = Flask(__name__)
8
9 app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///urls.db'
10
11 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False #disable tracking modifications not needed in the tutorial
12
13 db = sqlite3.connect('urls.db')
5.生成短URL
用戶可以使用哈希函數生成短URL,將原始URL轉換為唯一的短字符串。用于URL縮短器的一個聯合哈希函數是MD5,但也可以使用其他哈希函數,例如SHA-256或Base64編碼。MD5以原始URL作為輸入,對其進行哈希運算,并將前7個字符作為短URL。
Python
1 import hashlib
2
3
4
5 def generate_short_url(original_url):
6
7 # Hash the original URL using MD5
8
9 hash_object = hashlib.md5(original_url.encode())
10
11 hash_hex = hash_object.hexdigest()
12
13
14
15 # Take the first 7 characters of the hash as the short URL
16
17 short_url = hash_hex[:7]
18
19
20
21 return short_url
6.在數據庫中存儲短URL
在創建短URL之后,需要將它們存儲在已開發的數據庫方案中。數據庫將同時存儲短URL和原始URL。你可以使用INSERT INTO SQL命令將新記錄插入數據庫。
Python
1 def insert_url(original_url, short_url):
2
3 # Insert a new record into the urls table
4
5 cursor = db.cursor()
6
7 cursor.execute(
8
9 'INSERT INTO urls (original_url, short_url) VALUES (?, ?)',
10
11 (original_url, short_url)
12
13 )
14
15 db.commit()
16
17 cursor.close()
7.將短URL重定向到其原始URL
為了將短URL重定向到其原始URL,需要定義一個Flask路由,該路由將短URL作為參數處理,并使用數據庫中的SQL SELECT語句查找原始URL。
如果找到原始URL,代碼將使用Flask的重定向函數將用戶重定向到原始URL。如果沒有找到短URL,代碼將使用Flask的中止函數引發404錯誤。
Python
1 @app.route('/<short_url>')
2
3 def redirect_url(short_url):
4
5 # Look up the original URL in the database
6
7 cursor = db.cursor()
8
9 cursor.execute(
10
11 'SELECT original_url FROM urls WHERE short_url = ?',
12
13 (short_url,)
14
15 )
16
17 result = cursor.fetchone()
18
19 cursor.close()
20
21
22
23 if result:
24
25 # Redirect to the original URL
26
27 return redirect(result[0])
28
29 else:
30
31 # Handle error if the short URL is not found
32
33 abort(404)
8.處理錯誤
要處理錯誤,可以為常見的HTTP錯誤(如404 Not Found或500 Internal Server error)定義自定義錯誤頁。page_not_found函數使用Flask的render_template函數渲染自定義404錯誤頁面,并返回404 HTTP狀態代碼。internal_server_error函數也執行同樣的操作。
Python
1 @app.errorhandler(404)
2
3 def page_not_found(error):
4
5 # Render a custom 404 error page
6
7 return render_template('404.html'), 404
8
9
10
11 @app.errorhandler(500)
12
13 def internal_server_error(error):
14
15 # Render a custom 500 error page
16
17 return render_template('500.html'), 500
9.創建HTML模板
創建一個模板,該模板定義一個簡單的HTML表單,供用戶輸入要縮短的URL,并顯示一個縮短的URL列表(如果存在的話)。{{}}語法用于插入來自Flask應用程序的變量,{%%}語法用于控制結構,如循環和條件。將模板保存為index.html。
HTML
1 <!DOCTYPE html>
2
3 <html>
4
5 <head>
6
7 <title>URL Shortener</title>
8
9 </head>
10
11 <body>
12
13 <h1>URL Shortener</h1>
14
15 <form actinotallow="{{ url_for('shorten_url') }}" method="POST">
16
17 <label for="url">Enter your URL:</label>
18
19 <input type="url" id="url" name="url" required>
20
21 <button type="submit">Shorten</button>
22
23 </form>
24
25 {% if urls %}
26
27 <h2>Shortened URLs:</h2>
28
29 <ul>
30
31 {% for url in urls %}
32
33 <li><a href="{{ url.short_url }}">{{ url.short_url }}</a> - {{ url.original_url }}</li>
34
35 {% endfor %}
36
37 </ul>
38
39 {% endif %}
40
41 </body>
42
43 </html>
10.為Web界面創建Flask路由
將為呈現index.html模板的主頁定義一個路由,并將最近創建的十個URL的列表作為URL變量傳遞給模板。它還為呈現404.html模板的404錯誤定義了一個錯誤處理程序。
Python
1 @app.route('/')
2
3 def index():
4
5 # Render the homepage template
6
7 urls = Url.query.order_by(Url.created.desc()).limit(10).all()
8
9 return render_template('index.html', urls=urls)
10
11
12
13 @app.errorhandler(404)
14
15 def page_not_found(error):
16
17 # Render the 404 error template
18
19 return render_template('404.html'), 404
11.實現URL縮短表單
要實現URL縮短表單,需要定義一個Flask路由來處理表單提交,并為輸入的URL生成一個短URL。下面是一個如何做到這一點的例子:
這段代碼為/shortenURL定義了一個路由,用于處理來自URL縮短表單的POST請求。它使用請求從表單提交中檢索原始URL。form['url']使用前面的generate_short_url函數生成一個短URL,并使用SQLAlchemy將兩個URL存儲在數據庫中。最后,它將用戶重定向到主頁,并將新URL添加到列表中。
12.顯示縮短的URL列表
下面的代碼使用SQLAlchemy查詢從數據庫中檢索最近創建的十個URL,并將它們作為URL變量傳遞給index.html模板。該模板使用URL變量來顯示縮短的URL列表。
有了這些變化,現在應該有了一個功能齊全的URL縮短器,它可以使用Flask和Python構建Web界面!
Python
1 @app.route('/')
2
3 def index():
4
5 # Retrieve the 10 most recently created URLs from the database
6
7 urls = Url.query.order_by(Url.created.desc()).limit(10).all()
8
9
10
11 # Render the homepage template with the list of URLs
12
13 return render_template('index.html', urls=urls)
二、部署應用程序
選擇托管平臺
要部署Flask應用程序,必須選擇支持Python應用程序的托管平臺。有許多可用的托管選項,但一些流行的Flask應用程序的選擇包括:
- Heroku
- Google App Engine
- AWS Elastic Beanstalk
- DigitalOcean
- PythonAnywhere
每個平臺都有優點和缺點,所以研究并選擇最適合用戶需求的平臺是至關重要的。
三、結語
使用Flask和Python構建URL縮短器是學習如何使用Flask構建Web應用程序的好方法。可以使用在這一教程中學習的技能制作更復雜和高級的應用程序。Flask是一個強大而靈活的框架,可以讓用戶快速輕松地構建應用程序,它是構建任何規模和復雜性的Web應用程序的絕佳選擇。
原文鏈接:https://dzone.com/articles/how-to-build-a-url-shortener-web-app-with-flask-fr