一、Flask簡介與安裝¶
什麼是Flask?¶
Flask是一個輕量級的Python Web框架,由Armin Ronacher開發。它的設計理念是“微”(micro),即核心簡單且靈活,同時支持豐富的擴展來滿足複雜需求。相比Django的“電池包含”(內置大量功能),Flask更像一個基礎骨架,開發者可以按需添加組件,非常適合初學者上手,也能支撐大型項目的構建。
安裝Flask¶
安裝Flask非常簡單,推薦使用虛擬環境避免依賴衝突:
# 創建虛擬環境(可選但推薦)
python -m venv myenv
# 激活虛擬環境(Windows)
myenv\Scripts\activate
# 激活虛擬環境(Mac/Linux)
source myenv/bin/activate
# 安裝Flask
pip install flask
安裝完成後,在Python中驗證:
import flask
print(flask.__version__) # 輸出版本號,如2.0.1
二、Flask入門:第一個應用¶
Hello World¶
創建第一個Flask應用,新建app.py文件:
from flask import Flask
# 創建Flask應用實例
app = Flask(__name__)
# 定義路由:當用戶訪問根路徑('/')時,執行hello_world函數
@app.route('/')
def hello_world():
return 'Hello, Flask!' # 返回響應內容
# 啓動應用(僅在直接運行時生效)
if __name__ == '__main__':
app.run(debug=True) # debug=True開啓調試模式(開發用)
運行python app.py,訪問http://127.0.0.1:5000/即可看到“Hello, Flask!”。
三、核心技術:路由、視圖與模板¶
1. 路由與視圖函數¶
- 路由:通過
@app.route()裝飾器定義,指定URL路徑和HTTP方法。 - 視圖函數:處理路由請求並返回響應。
動態路由(帶參數)¶
支持URL參數,例如獲取用戶ID:
@app.route('/user/<int:user_id>') # <type:name>指定參數類型(int、string等)
def show_user(user_id):
return f'用戶ID: {user_id}' # 直接將參數傳入響應
# 訪問:http://127.0.0.1:5000/user/123
多HTTP方法支持¶
允許同一路由處理不同請求方式(GET/POST):
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return '登錄成功!'
else:
return '請填寫登錄表單' # GET請求時顯示錶單
注意:需導入
request對象:from flask import request
2. 模板引擎(Jinja2)¶
Flask默認使用Jinja2模板引擎,用於動態渲染HTML頁面。
基本使用¶
- 在項目根目錄創建
templates文件夾(必須命名),放入index.html:
<!-- templates/index.html -->
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title> <!-- 模板變量 -->
</head>
<body>
<h1>{{ message }}</h1>
{% if user %} <!-- 條件判斷 -->
<p>歡迎回來,{{ user.name }}!</p>
{% else %}
<p>請登錄</p>
{% endif %}
</body>
</html>
- 在視圖函數中渲染模板:
from flask import render_template # 導入渲染函數
@app.route('/')
def index():
context = {
'title': 'Flask入門',
'message': 'Hello, Jinja2!',
'user': {'name': '小明'} # 傳遞字典數據
}
return render_template('index.html', **context) # 解包字典
3. 靜態文件¶
CSS、JS、圖片等靜態資源放在static文件夾(必須命名),通過url_for引用:
<!-- 在模板中引用CSS -->
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<!-- 引用圖片 -->
<img src="{{ url_for('static', filename='logo.png') }}" alt="Logo">
四、核心功能進階¶
1. 會話管理與重定向¶
- 重定向:使用
redirect函數跳轉到指定URL:
from flask import redirect, url_for
@app.route('/goto-home')
def goto_home():
return redirect(url_for('index')) # 重定向到index路由
- 會話(Session):存儲用戶狀態(需設置密鑰):
app.secret_key = 'your-secret-key-here' # 密鑰(開發用隨機字符串)
@app.route('/login')
def login():
session['user_id'] = 123 # 存儲用戶ID到會話
return '登錄成功'
@app.route('/profile')
def profile():
user_id = session.get('user_id') # 獲取會話數據
return f'用戶ID: {user_id}'
2. 數據庫操作(Flask-SQLAlchemy)¶
Flask本身不內置ORM,但通過擴展Flask-SQLAlchemy可輕鬆操作數據庫(以SQLite爲例):
-
安裝擴展:
pip install flask-sqlalchemy -
配置與初始化:
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydb.db' # SQLite數據庫路徑
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 關閉修改跟蹤
db = SQLAlchemy(app) # 初始化數據庫
- 定義模型:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f'<User {self.name}>'
# 創建表(首次運行時執行)
with app.app_context():
db.create_all()
- 數據庫操作示例:
# 添加用戶
user = User(name='小紅', email='hong@example.com')
db.session.add(user)
db.session.commit()
# 查詢用戶
users = User.query.filter_by(name='小紅').first()
print(users.email) # 輸出:hong@example.com
3. 用戶認證(Flask-Login)¶
Flask-Login是處理用戶登錄、會話管理的擴展:
-
安裝:
pip install flask-login -
初始化與配置:
from flask_login import LoginManager, UserMixin
login_manager = LoginManager(app)
login_manager.login_view = 'login' # 未登錄時重定向到login路由
class User(UserMixin, db.Model): # UserMixin提供默認實現(is_authenticated等)
# 模型定義同上...
- 用戶加載與登錄:
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id)) # 根據ID加載用戶
@app.route('/login', methods=['POST'])
def login():
user = User.query.filter_by(name=request.form['name']).first()
if user and check_password_hash(user.password, request.form['password']):
login_user(user) # 登錄
return redirect(url_for('index'))
return '登錄失敗'
五、常用擴展與應用場景¶
1. Flask-WTF(表單處理)¶
快速處理表單驗證:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired
class LoginForm(FlaskForm):
name = StringField('用戶名', validators=[DataRequired()])
password = PasswordField('密碼', validators=[DataRequired()])
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit(): # 驗證表單
return '登錄成功'
return render_template('login.html', form=form)
2. Flask-RESTful(構建API)¶
快速開發RESTful風格的API:
from flask_restful import Api, Resource
api = Api(app)
class HelloAPI(Resource):
def get(self):
return {'message': 'Hello, API!'}
api.add_resource(HelloAPI, '/api/hello') # 綁定路由
3. Flask-Admin(後臺管理)¶
自動生成後臺管理界面,適合快速搭建內容管理系統:
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
admin = Admin(app)
admin.add_view(ModelView(User, db.session)) # 註冊User模型到後臺
六、部署與生產環境¶
1. 基礎部署¶
Flask內置服務器僅用於開發,生產環境需使用WSGI服務器:
- Gunicorn:pip install gunicorn,啓動命令:gunicorn -w 4 -b 0.0.0.0:8000 app:app(4個工作進程)
- Nginx:作爲反向代理,轉發請求到Gunicorn
2. 雲平臺部署¶
- PythonAnywhere:免費Python託管平臺,直接上傳代碼並設置
wsgi.py - Heroku:通過
Procfile指定啓動命令,配置環境變量(如SECRET_KEY) - Docker:容器化部署,Dockerfile示例:
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]
七、總結與學習路徑¶
核心收穫¶
- 基礎:路由、視圖、模板、靜態文件、會話
- 進階:數據庫(SQLAlchemy)、用戶認證(Login)、表單處理(WTF)
- 擴展:API開發(RESTful)、後臺管理(Admin)
學習建議¶
- 動手實踐:從簡單頁面(如個人博客、待辦清單)開始
- 閱讀官方文檔:Flask官方文檔
- 擴展探索:嘗試結合Flask-SocketIO實現即時聊天,或Flask-Caching優化性能
- 解決問題:遇到錯誤時優先查Flask常見問題
Flask的靈活性和豐富的擴展生態,使其既能快速開發小型項目,也能支撐大型應用。掌握核心技術後,通過擴展組件可實現複雜功能,這正是“從入門到精通”的關鍵!