一、什麼是Flask?¶
Web框架就像是建築中的“預製構件”,能幫我們快速搭建網頁應用,不用從零開始寫所有代碼。Flask是一個用Python編寫的輕量級Web框架,它的設計理念是“微”(Micro)——輕量、靈活,只提供最核心的功能,其他複雜功能可以通過擴展(Extensions)實現。
簡單來說,Flask就像一個空的房子框架,你可以根據需要添加牆壁(路由)、門窗(功能),但基礎結構已經幫你搭好了,讓你專注於寫網頁的業務邏輯。
二、爲什麼選擇Flask?¶
- 輕量靈活:沒有太多內置功能,你可以自由選擇需要的組件,比如想寫博客就加個ORM,想做用戶認證就加個登錄插件。
- 學習成本低:核心概念簡單,語法簡潔,適合新手入門Web開發。
- 擴展性強:雖然輕量,但有豐富的第三方擴展(如Flask-SQLAlchemy、Flask-Login等),能滿足複雜項目需求。
- 文檔友好:官方文檔清晰易懂,社區活躍,遇到問題容易找到解決方案。
三、核心概念詳解¶
1. 路由(Route):URL與函數的橋樑¶
路由就像地圖上的路標,告訴Flask“哪個URL對應哪個功能”。用裝飾器@app.route()定義:
@app.route('/') # 定義根目錄URL
def index(): # 視圖函數,處理URL請求
return "Hello, Flask!" # 返回頁面內容
- 裝飾器:Python的裝飾器是“語法糖”,給函數加上
@app.route('/')後,Flask會知道這個函數要處理根路徑/的請求。 - 路由變量:可以動態捕獲URL參數,比如用戶頁面:
@app.route('/user/<username>') # <username>是動態參數
def user_profile(username):
return f"Hello, {username}!" # 直接用參數拼接內容
2. 視圖函數(View Function):處理請求的核心¶
視圖函數是路由指向的“處理函數”,負責接收請求、處理數據、返回響應。比如:
@app.route('/greet')
def greet():
name = "Flask"
return f"<h1>Hello, {name}!</h1>" # 返回HTML內容
- 返回內容:可以直接返回字符串(含HTML標籤)、JSON(用
jsonify())或渲染模板(用render_template())。
3. 請求與響應(Request & Response)¶
- 請求對象(Request):從客戶端(瀏覽器)獲取數據,比如用戶輸入的表單、URL參數等。需要導入
request:
from flask import request
@app.route('/search', methods=['GET', 'POST'])
def search():
if request.method == 'POST': # 判斷請求類型(GET/POST)
keyword = request.form.get('keyword') # 獲取表單數據
return f"搜索關鍵詞:{keyword}"
else: # GET請求
return "請輸入關鍵詞"
- 響應對象(Response):給客戶端返回數據,最簡單的是用
return,還可以自定義狀態碼:
return "Not Found", 404 # 返回404錯誤
4. 模板(Templates):動態生成頁面¶
直接返回HTML字符串不靈活,模板引擎(Flask默認用Jinja2)能幫我們更高效地渲染頁面。步驟:
1. 在項目根目錄創建templates文件夾(必須命名爲templates)。
2. 在templates裏新建index.html:
<!DOCTYPE html>
<html>
<body>
<h1>Hello, {{ name }}!</h1> <!-- Jinja2變量渲染 -->
{% if age > 18 %}
<p>成年人</p>
{% else %}
<p>未成年人</p>
{% endif %}
</body>
</html>
- 在視圖函數中渲染模板:
from flask import render_template
@app.route('/template')
def use_template():
data = {
"name": "Flask",
"age": 20
}
return render_template('index.html', **data) # 傳遞數據給模板
5. 靜態文件(Static Files):CSS、JS、圖片等¶
靜態文件(如樣式表、圖片、JavaScript)放在項目根目錄的static文件夾中。通過url_for('static', filename='xxx')引用:
<!-- 在模板中引用CSS -->
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<!-- 引用圖片 -->
<img src="{{ url_for('static', filename='logo.png') }}">
6. 擴展(Extensions):讓功能更強大¶
Flask本身功能簡單,但擴展能幫你快速實現複雜需求,比如:
- Flask-SQLAlchemy:操作數據庫的ORM工具,不用寫原生SQL。
- Flask-Login:實現用戶登錄、註銷、會話管理。
- Flask-WTF:處理表單驗證(防重複提交、數據校驗)。
四、基礎應用實戰:從0到1寫一個簡單網站¶
1. 最小示例:第一個Flask應用¶
創建一個app.py文件(項目根目錄):
from flask import Flask
# 初始化Flask應用,__name__是當前模塊名
app = Flask(__name__)
# 定義路由和視圖函數
@app.route('/')
def home():
return "歡迎來到Flask小站!<a href='/about'>關於我們</a>"
@app.route('/about')
def about():
return "這是一個用Flask寫的簡單示例網站。"
# 啓動應用(僅在直接運行時生效)
if __name__ == '__main__':
app.run(debug=True, port=5000) # debug=True:代碼修改自動重啓
運行方式:在終端執行python app.py,打開瀏覽器訪問http://localhost:5000,就能看到“歡迎來到Flask小站!”頁面。
2. 擴展功能:添加模板和靜態文件¶
(1)創建項目結構¶
my_flask_app/
├── app.py # 主程序
├── templates/ # 模板文件夾
│ └── index.html # 首頁模板
└── static/ # 靜態文件文件夾
└── style.css # 樣式表
(2)修改index.html模板:¶
<!DOCTYPE html>
<html>
<head>
<title>Flask小站</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<h1>Hello, Flask!</h1>
<p class="intro">這是一個輕量級Web框架的示例。</p>
<a href="/about">關於我們</a>
</body>
</html>
(3)修改style.css:¶
body {
font-family: Arial;
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
.intro {
color: #666;
}
(4)修改app.py:¶
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html') # 渲染templates/index.html
@app.route('/about')
def about():
return render_template('about.html') # 假設about.html也在templates裏
if __name__ == '__main__':
app.run(debug=True)
現在重新運行app.py,就能看到帶樣式的頁面和超鏈接跳轉了!
五、總結與學習建議¶
Flask的核心優勢是“輕量+靈活”,適合從小項目起步,再逐步擴展功能。初學者可以先掌握基礎的路由、視圖、模板和靜態文件,再學習擴展工具(如ORM、用戶認證)。
學習資源推薦:
- 官方文檔:flask.palletsprojects.com
- 入門教程:跟着官方的“快速入門”(Quickstart)寫示例,邊做邊學
- 實踐項目參考:嘗試用Flask做一個簡單博客、待辦事項列表等
通過這篇文章,你已經瞭解了Flask的核心概念和基礎應用。接下來,動手嘗試修改示例代碼,比如添加表單提交、用戶參數動態渲染,就能更快掌握Web開發的基礎技能啦!