Flask從入門到精通:核心技術與擴展應用

一、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頁面。

基本使用

  1. 在項目根目錄創建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>
  1. 在視圖函數中渲染模板:
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爲例):

  1. 安裝擴展:pip install flask-sqlalchemy

  2. 配置與初始化:

   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)  # 初始化數據庫
  1. 定義模型:
   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()
  1. 數據庫操作示例:
   # 添加用戶
   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是處理用戶登錄、會話管理的擴展:

  1. 安裝:pip install flask-login

  2. 初始化與配置:

   from flask_login import LoginManager, UserMixin

   login_manager = LoginManager(app)
   login_manager.login_view = 'login'  # 未登錄時重定向到login路由

   class User(UserMixin, db.Model):  # UserMixin提供默認實現(is_authenticated等)
       # 模型定義同上...
  1. 用戶加載與登錄:
   @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服務器:
- Gunicornpip 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)

學習建議

  1. 動手實踐:從簡單頁面(如個人博客、待辦清單)開始
  2. 閱讀官方文檔Flask官方文檔
  3. 擴展探索:嘗試結合Flask-SocketIO實現即時聊天,或Flask-Caching優化性能
  4. 解決問題:遇到錯誤時優先查Flask常見問題

Flask的靈活性和豐富的擴展生態,使其既能快速開發小型項目,也能支撐大型應用。掌握核心技術後,通過擴展組件可實現複雜功能,這正是“從入門到精通”的關鍵!

小夜