本文將介紹Flask,一個流行的Python微框架,它提供了與Django這樣的巨頭不同的選擇。
Flask旨在輕量級和靈活,使開發者能夠快速輕鬆地創建網絡應用。在本文中,我們將涵蓋Flask是什麼,其主要特點,其簡單API的好處,支持第三方擴展的靈活性,最常見的Flask擴展,以及何時使用Flask是合適的,何時不合適。
關鍵要點
Flask是什麼?
Flask是一個用Python編寫的微型網絡框架,用於開發網絡應用程序。它遵循簡單和輕量級的理念,僅提供開發網絡應用所需的最重要工具,避免不必要的複雜性。
它基於Werkzeug WSGI工具包構建,該工具包提供處理請求和響應所需的網絡服務器功能,以及Jinja2模板引擎,使Flask能夠處理HTML模板,從而允許開發者創建動態網絡應用。
以下是使Flask成為出色框架的一些關鍵特性:
- 它具有用於創建網絡路由和處理請求的簡單API。
- Jinja模板引擎提供對HTML模板的支援,使開發者能輕鬆創建網頁。
- 由於其對第三方擴展的支持,它具有高度可擴展性,開發者可以根據項目需求安裝擴展。
- 它內置了一個開發伺服器,方便測試和調試應用。
總體而言,Flask提供了一個強大、靈活且簡單的框架來構建網路應用。無論是新手還是有經驗的網路開發者,Flask都是一個很好的選擇,並且是Python網路開發生態中最受歡迎的框架之一。
Flask的優勢
現在讓我們更詳細地看看使用Flask開發的一些優勢。
簡單性。Flask的設計理念強調簡單性,這使得任何水平的開發者都能輕鬆理解和使用。這也意味著開發者只需學習少量概念和API即可開始構建網路應用,學習曲線非常平緩。
靈活性。Flask的微型特性——僅提供網路框架的核心功能——賦予開發者通過Flask擴展或第三方庫來定制和擴展其以滿足需求的能力。
文檔。Flask的文檔非常全面,涵蓋了從基礎到高級的主題,使得開發者能夠輕鬆學習如何使用該框架。
兼容性。Flask 與多種 Python 版本兼容,使其易於與現有的 Python 代碼庫配合使用。它還支持多種網絡服務器,使其易於部署在各種托管平台上。
快速開發。Flask 的簡單性和靈活性減少了設置應用程序所需的模板代碼,使開發人員能夠快速開始。
在網絡上,Flask 以許多有趣的方式被使用。一些值得注意的例子包括:
- PgAdmin。Postgres 的管理界面運行在 Flask 實例上,為開發人員提供了一個可以管理其 Postgres 數據庫的界面。
- Twilio。這是一個通信平台,在其幾個 API 中使用了 Flask。
- Pinterest。這個照片分享應用在其 Web 開發堆棧中使用了 Flask,使其團隊能夠輕鬆創建一些自定義功能和集成。
何時使用 Flask
Flask 的簡單性和易用性使其成為各種 Web 項目的優秀選擇:
- 原型製作。其易用性和靈活性使其成為快速創建原型的優秀選擇,允許開發人員快速構建和測試新功能。
- 創建 RESTful API。其簡單的 API 使其容易創建和處理 HTTP 請求。
- 電子商務應用。它非常適合構建在線市場和電子商務平台。
- 財務。它對於建立財務應用程式非常有用,包括帳戶管理、交易處理和投資追蹤。
- AI。它提供了一種簡單有效的方式來建立和部署AI訓練模型。
何時不應使用Flask
雖然Flask是一個出色的框架,並且擁有多項優勢和卓越功能,但在某些情況下,這些功能反而成為其劣勢。讓我們探討一些更適合其他類型框架的項目。
需要內建功能的項目。作為一個微框架,Flask僅提供創建網路應用程式所需的核心部分。如果項目需要,例如,一個管理界面、認證或ORM,那麼Django是更好的選擇。
對安全性有嚴格要求的項目。由於Flask是一個靈活的框架,我們必須依賴第三方擴展來在我們的應用程式中實現一定程度的保安。雖然這確實有效,但最好依賴一個經過更多實戰檢驗的框架,該框架採取更安全的做法,例如Tornado或Twisted。
強制執行某些編碼標準的項目。由於Flask的靈活性,開發人員可以按照自己認為合適的方式開發應用程式。然而,像Django這樣的框架確保開發人員遵循特定的慣例,這意味著開發人員可以輕鬆地從一個項目轉移到另一個項目。
設置Flask開發環境
現在讓我們來看看如何開始使用Flask,從設置開發環境、安裝,到最後啟動一個最小化的應用程序。
前提條件
開發機器上必須已安裝Python。以下是安裝指南(儘管我們可能已經安裝了)。
創建虛擬環境
A virtual environment is an isolated Python environment where we can install packages for a given project without affecting the global Python installation. (Here’s further discussion about why virtual environments are useful.) There are different packages for creating virtual environments in Python, such as virtualenv, venv, or Conda.
本文中,我們將使用virtualenv
。可以使用以下命令安裝它:
pip install virtualenv
安裝virtualenv
後,我們可以創建一個目錄,用於存放Flask應用程序。目錄名稱可以任意選擇,只要不是Flask
,因為這會導致衝突。我們將其命名為flask_intro
:
mkdir flask_intro
接著,切換到該目錄以便開始使用:
cd flask_intro
在該目錄下,現在讓我們使用以下命令創建虛擬環境:
virtualenv myenv
上述命令創建了一個名為myenv
的虛擬環境。讓我們激活它,以便在其中安裝Flask。在Linux或macOS上,使用以下命令激活:
. myenv/bin/activate
在Windows上,使用此命令:
. myenv\Scripts\activate
一旦虛擬環境被激活,它將在shell提示符中顯示虛擬環境的名稱,類似於以下輸出:
(myenv)/~(path to your project directory)$
在我們已啟動的虛擬環境中,可以開始安裝Flask,使用以下命令:
pip install Flask
安裝完成後,接著創建一個最小化的應用程式。我們將建立一個模組來存放我們的Flask應用程式。為了簡單起見,我們將其命名為hello.py
。在Linux或macOS系統中,可以使用以下命令在flask_intro
目錄下創建該文件:
touch hello.py
上述命令會創建一個名為hello.py
的文件。我們也可以使用開發環境來創建這個文件。文件創建後,將以下代碼放入並保存:
# hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
在上述代碼中,我們從flask
模組導入Flask
類,然後創建一個名為app
的Flask
實例,並傳遞__name__
變數。
接著是路由裝飾器@app.route(“\”)
,這意味著當有人訪問我們應用程式的根路徑時,hello_world()
函數將被觸發。
有多種方式可以運行應用程式,讓我們看看其中一些方法。第一種方式是向flask
命令提供多個參數:--app
,接著是包含我們Flask應用程式的模組名稱,然後是run
。參考以下:
flask –app <the name of your module> run
使用上述示例來運行我們的樣本應用程式:
flask –app hello run
這將在我們的應用程式上運行預設埠5000
,因此應用程式將可以在http://localhost:5000/
或http://127.0.0.1:5000/
上訪問。如果我們希望應用程式在不同的埠上可用,我們可以使用-p
或--port
選項指定埠。例如:
flask --app hello run --port=8080
這將在埠8080上運行伺服器。另一種運行應用程式的方法是僅使用flask run
命令。然而,為了能夠這樣做,我們需要告訴Flask包含Flask實例的模組名稱,我們通過設置FLASK_APP
環境變數來實現。因此,在我們的情況下,Flask應用程式包含在一個名為hello.py
的文件中。所以我們可以這樣設置:
export FLASK_APP=hello
現在,我們已經設置了FLASK_APP
環境變數,我們可以像這樣運行開發伺服器:
flask run
通過這段代碼,我們現在運行了一個Web應用程式。這展示了Flask的核心理念:我們不需要大量的模板代碼來啟動事情。然而,我們上面設置的應用程式並不是很功能性或有用,因為它只在我們的網頁上渲染字符串“Hello World!”。為了做更多有用的事情,我們可以轉向模板。接下來,我們將看看如何處理它們。
Flask模板
Flask模板是一種創建動態網頁的方式,可以根據各種因素(如來自資料庫的數據或用戶輸入)顯示不同的內容。Flask中的模板是HTML和特殊佔位符的組合,稱為模板變數,這些佔位符在運行時被替換為實際值。
模板存儲在 templates
目錄中。因此,要使用模板,我們需要從 flask
導入 render_template()
方法。render_template()
方法接受一個模板名稱以及任何需要傳遞給模板的可選數據。
讓我們看一個使用模板渲染網頁的函數示例:
# index.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
title = 'Welcome to my website!'
message = 'This is an example of using Flask templates.'
return render_template('index.html', title=title, message=message)
在上面的示例中,我們有一個視圖函數 — index()
— 通過 @app.route()
裝飾器綁定到根 URL(“/”)。該函數有兩個變量,title
和 message
。最後,我們將模板 index.html
與 title
和 message
變量一起傳遞給 render_template()
。
為了使上述代碼正常工作,我們需要在 templates 目錄中有一個 index.html
模板。因此,模板將如下所示:
# index.html
<!doctype html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ title }}</h1>
<p>{{ message }}</p>
</body>
</html>
在 index.html
文件中,佔位符 {{title}}
和 {{ message }}
被替換為在 render_template()
方法中傳遞給模板的值。
模板還可以包含更複雜的邏輯,如 if
語句和 for
循環,這允許生成更動態的頁面。
因此,Flask 中的模板為開發者提供了一個非常強大的選項,用於創建充滿用戶生成信息的動態網頁。
Flask 路由
多數網頁應用程式擁有多個URL,因此我們需要一種方式來了解哪個功能處理哪個URL。在Flask中,這種對應關係被稱為路由——即將URL綁定或映射到視圖函數的過程。將URL綁定到視圖函數使得應用程式能夠處理不同類型的請求,例如GET
、POST
、PUT
、DELETE
等。同時,它也允許應用程式處理來自不同客戶端的多次請求。
要在Flask中設置路由,我們使用route()
裝飾器。裝飾器將一個URL綁定到一個視圖函數——因此當用戶訪問我們應用程式上存在的某個URL時,Flask會觸發相關聯的視圖函數來處理該請求。
讓我們看一個例子:
# hello.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/about")
def about():
return "This is the about page"
在上面的例子中,我們定義了一個關於URL(/about
)。當應用程式收到對about
URL的請求時,Flask會調用about()
函數,該函數返回字符串“這是關於頁面”。
到目前為止,儘管這些例子返回不同的頁面,但它們都僅使用了GET
HTTP請求。為了能夠處理任何特定的請求,我們可以將HTTP方法作為route()
裝飾器的可選參數進行指定。
讓我們看一個PUT
請求的例子:
from flask import Flask, request
app = Flask(__name__)
@app.route('/users/<int:user_id>', methods=['PUT'])
def update_user(user_id):
從請求主體獲取用戶數據
data = request.get_json()
對用戶數據進行某些操作,例如在數據庫中更新用戶
...
返回一個響應,指示成功或失敗
return {'message': f'User {user_id} updated successfully'}, 200
在此示例中,我們定義了一個路由,處理對更新用戶詳細信息的PUT
請求,給定其user_id
。我們在路由中使用<int:user_id>
來表示用戶ID應該是一個整數。
在update_user()
函數中,我們使用request.get_json()
方法從請求主體獲取用戶數據。我們對用戶數據進行某些操作,例如在數據庫中更新用戶,然後返回一個響應,指示成功或失敗,並附帶一個HTTP狀態碼(在此情況下為200
,表示成功)。
總體而言,路由使Flask能夠處理不同類型的請求,並根據用戶訪問的URL使應用程序能夠以不同方式處理和操作數據。
Flask表單和驗證
除了向用戶展示數據外,Flask模板還可以從用戶那裡獲取輸入以進行進一步處理或存儲。為此,Flask提供了內置支持,用於處理HTML表單和處理用戶輸入。Flask表單基於WTForms庫,該庫提供了一種靈活而強大的方式來處理表單數據並執行驗證。然而,該庫不是標準Flask安裝的一部分,因此我們需要使用以下命令進行安裝:
pip install WTForms
安裝WTForms後,要在Flask中使用表單,我們需要定義一個繼承自flask_wtf.FlaskForm
的表單類別。該類別將包含表單上的欄位以及應該對其應用的任何驗證規則。
讓我們看一個登入表單的例子:
# forms.py
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email, Length
class LoginForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired(), Length(min=6)])
submit = SubmitField('Log In')
在上面的例子中,我們定義了一個包含兩個欄位——email
和password
——以及一個提交按鈕的登入表單。我們還有一個validators
參數,用於指定每個欄位的驗證規則。例如,在此情況下,我們要求email
欄位包含一個有效的電子郵件地址,而password
欄位包含不少於六個字元的密碼。
定義了表單類別後,我們可以在登入視圖函數中使用它來渲染表單並處理用戶提交的表單數據。讓我們看一個視圖函數的例子:
# views.py
from flask import render_template, request
from .forms import LoginForm
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
email = form.email.data
password = form.password.data
# 處理表單數據
return render_template('login.html', form=form)
在上面的例子中,我們有一個login
視圖,它接受兩種HTTP方法(GET
和POST
),因此當用戶從瀏覽器訪問URL時,LoginForm
將使用render_template
方法作為HTML表單進行渲染,當用戶提交表單時,我們使用validate_on_submit
方法檢查表單是否有效。如果表單有效,我們訪問電子郵件和密碼。
login.html
表單可能看起來像這樣:
# login.html
<h1>Login</h1>
<form method="POST">
{{ form.csrf_token }}
<div>
{{ form.email.label }} {{ form.email() }}
{% for error in form.email.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
<div>
{{ form.password.label }} {{ form.password() }}
{% for error in form.password.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
{{ form.submit() }}
</form>
上述模板將呈現email
和password
欄位,連同其標籤,以及一個文字為“登入”的提交按鈕。form.csrf_token
欄位包含在內,以防止跨站請求偽造(CSRF)攻擊。{% for %}
循環用於顯示可能發生的任何驗證錯誤。
透過使用Flask表單,我們擁有一種強大的處理用戶輸入的方式,並且能夠驗證他們輸入的數據。
Flask擴展
如我們所見,Flask是一個微框架,僅包含創建Web應用程序所需的最重要部分。然而,如果我們需要添加Flask默認未提供的功能,我們需要添加包到安裝中。Flask擴展是我們提供這些額外功能的方式。我們只需安裝所需的包。Flask社區已經製作了許多擴展。
以下是一些最受歡迎的擴展:
- Flask-SQLAlchemy:提供與SQLAlchemy工具包的整合,使得與數據庫互動變得容易。
- Flask-Login:為Flask提供用戶認證和會話管理。
- Flask-Mail:提供一個簡單的界面,從Flask發送電子郵件。
Flask社區已經製作了數百個擴展,用於處理不同的功能。使用擴展通常很直接。首先,我們需要使用pip安裝我們想要的擴展。
讓我們看一個使用Flask-SQLAlchemy的例子。首先,我們需要安裝它:
pip install flask-sqlalchemy
接下來,我們需要進行配置。例如:
# sqlalchemy_example.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return '<User %r>' % self.username
在上面的例子中,我們有一個User
模型,包含username
和email
字段。我們還配置了SQLALCHEMY_DATABASE_URI
,表明我們使用位於example.db
的SQLite數據庫。設置好後,我們就可以通過db
對象與數據庫進行交互。例如,我們可以創建一個新用戶並將其添加到數據庫中,如下所示:
#views.py
from app import db, User
user = User(username='john', email='[email protected]')
db.session.add(user)
db.session.commit()
借助Flask擴展,我們的應用程序能夠擁有比僅使用核心Flask實現更多的功能。
結論
在本文中,我們介紹了Flask,一個輕量級且靈活的Python Web框架。我們討論了使用Flask進行Web開發的優勢,包括其簡單性、靈活性和易用性。我們還介紹了如何設置開發環境、創建路由、使用模板、處理表單以及使用擴展如Flask-SQLAlchemy。
總結來說,Flask是構建任何規模Web應用程序的絕佳選擇,從小型個人項目到大型商業應用。它易於學習和使用,同時也通過其眾多擴展提供高級功能。
如果您對深入了解Flask感興趣,以下是一些額外資源:
- Flask文檔
- Flask 大型教程,由 Miguel Grinberg 著
- Flask 網頁開發,由 Miguel Grinberg 著
- A simple Flask app tutorial
- Real Python Flask 教學
如果你想了解更多關於 Django 和 Flask 及其最佳使用案例,請查看使用 Django 和 Flask 進行 Python 網頁開發.
Flask,Python 框架常見問題解答
什麼是 Flask?
Flask 是一個適用於 Python 的微型網頁框架。它設計輕巧且易於使用,是開發網頁應用程式和 API 的優秀選擇。
我如何安裝 Flask?
你可以使用 Python 的套件管理器 pip 來安裝 Flask。使用命令 pip install Flask
在你的系統上安裝 Flask。
Flask 的主要特點是什麼?
Flask 以其簡單性、靈活性和極簡主義聞名。它提供了 URL 路由、請求處理和模板渲染等特性,同時允許開發者根據需要選擇和整合其他組件。
Flask 與其他 Python 網頁框架如 Django 相比如何?
Flask 是一個微框架,而 Django 是一個全棧式網頁框架。Flask 提供更多的靈活性和自由來選擇你的組件,而 Django 則內建了許多功能和慣例。
我可以用 Flask 建立 RESTful API 嗎?
可以,Flask 非常適合用於建立 RESTful API。它的簡潔性以及對 HTTP 方法的支持使其成為創建 API 端點的熱門選擇。
Flask 適合用於大型網路應用程式嗎?
Flask 可以用於大型應用程式,但相比於像 Django 這樣的全棧框架,它可能需要更多的手動配置和整合額外的組件。