Python Flask 介紹

語言: CN / TW / HK

一、概述

Python Flask是一個輕量級的Web應用程序框架,它是使用Python編寫的,用於快速開發Web應用程序和API。它的設計理念是簡單、易用和可擴展。

以下是Python Flask的一些主要特點:

  • 輕量級:Flask沒有多餘的庫和工具包,使其非常輕量級,這也意味着您可以根據需要添加自己的庫。

  • 易用性:Flask的API非常簡單,易於理解和學習,因此它非常適合初學者。

  • 可擴展性:Flask是可擴展的,您可以添加插件來增強其功能,並且可以很容易地將其與其他庫和框架集成。

  • 靈活性:Flask允許您選擇所需的組件,例如模板引擎、數據庫、表單驗證等等。

  • 集成度高:Flask支持與其他Python庫和框架的集成,如SQLAlchemy、WTForms、Jinja2等等。

  • RESTful支持:Flask易於使用RESTful API,並且可以輕鬆地創建RESTful Web服務。

總之,Python Flask是一個功能強大、易於使用、可擴展和靈活的Web框架,它被廣泛應用於Web應用程序和API的開發。

官網:http://flask.net.cn/

二、Flask 架構

Flask 是一個使用 Python 編寫的 Web 應用程序框架。它使用了 Werkzeug 工具箱和 Jinja2 模板引擎。

Flask 框架主要由以下模塊組成:

在這裏插入圖片描述

  • 應用模塊:Flask 的核心模塊,是整個 Web 應用程序的入口,負責接收 HTTP 請求並返回響應。它還負責路由、錯誤處理、上下文等功能。

  • 路由模塊:Flask 使用裝飾器來定義 URL 路由和視圖函數之間的映射關係。

  • 視圖模塊:視圖函數是 Flask Web 應用程序的核心,它處理 HTTP 請求並返回響應,可以返回 HTML 頁面、JSON 數據等。

  • 模板模塊:Flask 使用 Jinja2 模板引擎來生成 HTML 頁面。模板引擎提供了豐富的語法和過濾器,可以輕鬆地生成複雜的 HTML 頁面。

  • 數據庫模塊:Flask 可以輕鬆地與多種數據庫集成,包括 MySQL、PostgreSQL、SQLite 等。

  • 表單模塊:Flask-WTF 是 Flask 的表單處理擴展,提供了方便的表單處理方法,可以輕鬆地創建表單、驗證表單數據等。

  • 擴展模塊:Flask 的擴展模塊提供了各種功能,如郵件發送、緩存、登錄認證等。

Flask 的設計理念是簡單、靈活、易於擴展,它不會限制開發者的選擇,可以根據開發者的需求選擇各種第三方擴展來增加功能。同時,Flask 也提供了一些基礎的功能和工具,方便開發者快速搭建 Web 應用程序。

三、應用模塊

應用模塊是 Flask 框架的核心模塊之一,它負責創建 Flask 應用程序對象,並定義一些應用程序級別的配置和功能。應用模塊通常包括以下內容:

  • 創建應用程序對象:使用 Flask 類創建應用程序對象。Flask 類的構造函數需要傳入應用程序的名稱作為參數。

  • 配置應用程序:可以使用 config 屬性來配置應用程序的基本屬性,如調試模式、密鑰、數據庫連接等。

  • 註冊路由:使用 route 裝飾器來註冊 URL 路由和視圖函數之間的映射關係。路由定義了 HTTP 請求的 URL 地址和視圖函數之間的映射關係。

  • 定義視圖函數:視圖函數是處理 HTTP 請求的函數,可以返回 HTML 頁面、JSON 數據等。視圖函數通常使用 route 裝飾器定義 URL 路由。

  • 上下文管理:Flask 應用程序使用上下文對象來管理請求上下文和應用上下文。請求上下文包含了每個 HTTP 請求的相關信息,如請求頭、請求參數等。應用上下文包含了應用程序的相關信息,如配置信息、數據庫連接等。

  • 錯誤處理:Flask 應用程序可以通過註冊錯誤處理函數來處理 HTTP 請求中出現的錯誤,如 404 錯誤、500 錯誤等。

  • 擴展管理:Flask 應用程序可以通過註冊擴展對象來增加應用程序的功能,如數據庫連接、緩存、郵件發送等。

  • 啟動應用程序:通過 run 方法啟動應用程序,使其可以接收 HTTP 請求。

應用模塊是 Flask 應用程序的核心模塊之一,它負責管理整個應用程序的生命週期,是開發 Flask Web 應用程序的重要組成部分。

【示例】 以下是一個簡單的 Flask 應用程序示例,演示瞭如何使用應用模塊來創建 Flask 應用程序對象、註冊路由和視圖函數、配置應用程序等。

```python from flask import Flask, render_template

app = Flask(name)

配置應用程序

app.config['DEBUG'] = True app.config['SECRET_KEY'] = 'your_secret_key'

註冊路由和視圖函數

@app.route('/') def index(): return 'Hello, World!'

@app.route('/user/') def user(name): return 'Hello, %s!' % name

@app.route('/hello/') @app.route('/hello/') def hello(name=None): return render_template('hello.html', name=name)

啟動應用程序

if name == 'main': app.run() ``` 代碼講解:

  • 在上面的示例中,我們首先導入了 Flask 類和 render_template 函數。然後創建了一個 Flask 應用程序對象,使用了__name__ 作為應用程序的名稱。接着配置了應用程序的一些基本屬性,包括調試模式和密鑰等。

  • 然後使用 @app.route() 裝飾器來註冊 URL 路由和視圖函數之間的映射關係。我們定義了三個視圖函數,分別對應不同的 URL 地址,可以返回不同的響應內容。其中 /hello//hello/<name> 兩個路由對應的是同一個視圖函數,使用了 Flask 支持的多路由規則。

  • 最後使用 app.run() 方法啟動了應用程序,使其可以接收 HTTP 請求。

  • 注意,在開發過程中,我們通常不會將 Flask 應用程序對象的 run() 方法直接放在程序的主體代碼中,而是使用一個單獨的腳本來啟動應用程序,如:

python if __name__ == '__main__': app.run()

四、路由模塊

路由模塊是 Flask 應用程序的核心組成部分之一,它實現了 URL 路由和視圖函數之間的映射關係。在 Flask 中,我們可以通過定義路由模塊來為應用程序添加不同的路由規則,使得應用程序可以響應不同的 URL 請求。

在 Flask 中,可以使用裝飾器來定義路由模塊。常用的裝飾器包括:

  • @app.route(rule, options):定義路由規則和處理函數之間的映射關係。其中 rule 參數表示路由規則,options 參數表示路由的配置選項。

例如,下面的示例定義了一個路由規則,用於處理 /hello URL 請求,並返回一個包含字符串的響應:

```python from flask import Flask

app = Flask(name)

@app.route('/hello') def hello(): return 'Hello, World!' `` -@app.before_request`:在每個請求被處理之前執行的函數。通常用於執行一些預處理操作,例如驗證用户的登錄狀態、設置全局變量等。

例如,下面的示例定義了一個 before_request 函數,用於在處理請求之前打印請求的 HTTP 方法和 URL:

```python from flask import Flask, request

app = Flask(name)

@app.before_request def log_request(): print(f'Request: {request.method} {request.url}')

`` -@app.after_request`:在每個請求被處理之後執行的函數。通常用於執行一些後處理操作,例如添加響應頭信息、記錄日誌等。

例如,下面的示例定義了一個 after_request 函數,用於在處理請求之後添加一個名為 X-My-Header 的響應頭:

```python from flask import Flask

app = Flask(name)

@app.after_request def add_header(response): response.headers['X-My-Header'] = 'Hello, World!' return response

`` -@app.errorhandler:處理指定錯誤碼的異常,例如404錯誤、500` 錯誤等。可以定義多個不同的錯誤處理函數,以處理不同的異常情況。

例如,下面的示例定義了一個 404 錯誤處理函數,用於處理訪問不存在的 URL 時的異常情況:

```python from flask import Flask, render_template

app = Flask(name)

@app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404

`` 在上面的示例中,我們定義了一個page_not_found()函數,並使用@app.errorhandler(404)裝飾器將其註冊為處理404錯誤的函數。在處理404錯誤時,Flask 會調用該函數,並將異常對象作為參數傳入。函數返回一個包含錯誤信息的響應,並將HTTP狀態碼設置為404`。

總之,路由模塊是 Flask 應用程序的重要組成部分,它可以通過不同的裝飾器實現請求預處理、響應後處理、錯誤處理等功能。下面是一個完整的 Flask 路由模塊的示例:

```python from flask import Flask, request, render_template

app = Flask(name)

請求預處理函數

@app.before_request def log_request(): print(f'Request: {request.method} {request.url}')

路由規則和處理函數

@app.route('/') def index(): return 'Hello, World!'

@app.route('/hello') def hello(): return 'Hello, World!'

@app.route('/hello/') def hello_name(name): return f'Hello, {name}!'

響應後處理函數

@app.after_request def add_header(response): response.headers['X-My-Header'] = 'Hello, World!' return response

錯誤處理函數

@app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404

啟動應用程序

if name == 'main': app.run()

``` 在上面的示例中,我們定義了一個 Flask 應用程序,並使用 @app.route 裝飾器定義了三個路由規則和處理函數:

  • / URL 請求將會調用 index() 函數,並返回一個字符串 'Hello, World!'。
  • /hello URL 請求將會調用 hello() 函數,並返回一個字符串 'Hello, World!'。
  • /hello/<name> URL 請求將會調用 hello_name(name) 函數,並返回一個包含 name 參數的字符串 'Hello, {name}!'。

我們還使用了 @app.before_request 裝飾器定義了一個請求預處理函數 log_request(),用於在每個請求被處理之前打印請求的 HTTP 方法和 URL

同時,我們還使用了 @app.after_request 裝飾器定義了一個響應後處理函數 add_header(response),用於在每個請求被處理之後添加一個名為 X-My-Header 的響應頭。

最後,我們使用 @app.errorhandler 裝飾器定義了一個 404 錯誤處理函數 page_not_found(e),用於處理訪問不存在的 URL 時的異常情況。

整個路由模塊的代碼非常簡單明瞭,通過 Flask 提供的裝飾器可以輕鬆地定義路由規則和處理函數,實現不同 URL 請求的響應。

五、視圖模塊

在 Flask 中,視圖模塊用於處理請求並生成響應,通常由視圖函數來實現。視圖函數負責處理一個或多個 URL 請求,並返回一個響應對象。響應對象可以是純文本、HTML、JSON、圖像等。

下面是一個簡單的 Flask 視圖模塊的示例:

```python from flask import Flask, request, jsonify

app = Flask(name)

視圖函數

@app.route('/hello') def hello(): name = request.args.get('name', 'World') return f'Hello, {name}!'

@app.route('/json') def json(): data = {'message': 'Hello, World!'} return jsonify(data)

啟動應用程序

if name == 'main': app.run()

``` 在上面的示例中,我們定義了兩個視圖函數:

  • hello() 函數處理 /hello URL 請求,使用 request.args.get() 方法獲取請求參數中的 name 參數(默認為 'World'),並將其插入到響應字符串中返回給客户端。
  • json() 函數處理 /json URL 請求,生成一個包含 message 屬性的字典對象,然後使用 Flask 提供的 jsonify() 函數將其轉換為 JSON 格式的響應對象返回給客户端。

啟動 Flask 應用程序後,可以在瀏覽器中訪問 /hello/json URL 來測試視圖函數的效果。

視圖函數是 Flask 應用程序的核心組成部分,可以通過不同的方式生成響應,如使用模板引擎渲染 HTML 頁面、返回純文本或 JSON 數據等。視圖函數還可以接受請求參數,通過 request 對象獲取請求數據,並根據請求參數生成相應的響應。

六、模板模塊

在 Flask 中,模板模塊用於生成動態的 HTML 頁面或其他類型的文檔。Flask 支持多種模板引擎,如 Jinja2、Mako、Mustache 等,其中 Jinja2 是最常用的模板引擎之一。

下面是一個簡單的 Flask 模板模塊的示例,使用 Jinja2 模板引擎渲染一個 HTML 頁面:

```python from flask import Flask, render_template

app = Flask(name)

路由規則和視圖函數

@app.route('/') def index(): return render_template('index.html', name='World')

啟動應用程序

if name == 'main': app.run()

`` 在上面的示例中,我們定義了一個路由規則/,並使用render_template()函數將模板文件index.html渲染為 HTML 頁面,其中傳遞了一個名為name的變量值為'World'`。

下面是 index.html 模板文件的示例:

```python

Hello, {{ name }}!

Hello, {{ name }}!

``` 代碼講解:

  • 在上面的示例中,使用了 Jinja2 模板引擎的語法 {{ name }},它將在渲染模板時被替換為 render_template() 函數中傳遞的 name 變量的值。

  • 啟動 Flask 應用程序後,訪問根 URL / 將會返回一個包含 Hello, World! 的 HTML 頁面。

  • 模板模塊是 Flask 應用程序的重要組成部分,它可以實現動態生成各種類型的文檔,如 HTML 頁面、JSON 數據、CSV 文件等。在 Flask 中,使用模板引擎可以方便地將數據和 HTML 頁面進行分離,實現更加清晰和易於維護的代碼結構。

七、數據庫模塊

在 Flask 應用程序中,通常需要使用數據庫來存儲和管理數據。Flask 提供了多種數據庫模塊的支持,如 SQLAlchemyPeeweeMongoDB 等。

下面以 SQLAlchemy 為例,介紹如何在 Flask 應用程序中使用數據庫模塊。

1)安裝 SQLAlchemy

使用 pip 安裝 SQLAlchemy:

python pip install SQLAlchemy

2)配置數據庫連接

在 Flask 應用程序中,需要配置數據庫連接,包括數據庫類型、主機名、端口號、數據庫名、用户名和密碼等。可以使用 Flask 應用程序的配置對象 app.config 來存儲這些配置信息,如下所示:

```python from flask import Flask from flask_sqlalchemy import SQLAlchemy

app = Flask(name) app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://user:password@localhost/mydatabase' db = SQLAlchemy(app)

`` 在上面的示例中,我們使用SQLAlchemy模塊創建了一個數據庫連接db,並將其關聯到 Flask 應用程序對象app` 上。

3)定義數據庫模型

使用 SQLAlchemy 模塊可以方便地定義數據庫模型,例如下面的示例定義了一個簡單的用户模型:

```python from datetime import datetime from sqlalchemy import Column, Integer, String, DateTime

class User(db.Model): id = Column(Integer, primary_key=True) name = Column(String(50), nullable=False) email = Column(String(120), unique=True, nullable=False) created_at = Column(DateTime, default=datetime.now) `` 在上面的示例中,我們使用SQLAlchemy提供的Column類定義了三個列:idnameemailcreated_at。其中,id是主鍵列,nameemail是字符串列,created_at` 是日期時間列。

4)數據庫操作

使用 SQLAlchemy 模塊可以方便地執行數據庫操作,例如下面的示例:

```python

創建數據庫表

db.create_all()

插入數據

user = User(name='Alice', email='[email protected]') db.session.add(user) db.session.commit()

查詢數據

users = User.query.all()

更新數據

user.name = 'Bob' db.session.commit()

刪除數據

db.session.delete(user) db.session.commit()

`` 在上面的示例中,我們使用db.create_all()創建數據庫表,使用db.session.add()插入數據,使用User.query.all()查詢數據,使用db.session.commit()提交事務。還可以使用db.session.query()查詢數據,使用db.session.filter()過濾數據,使用db.session.order_by()` 排序數據等。

數據庫模塊是 Flask 應用程序的核心組成部分之一,它可以方便地實現數據的存儲和管理,為 Web 應用程序提供強大的數據支持。在使用數據庫模塊時,需要注意數據的安全性和可靠性,如防止 SQL 注入攻擊、處理事務、使用數據庫索引等。

八、表單模塊

表單模塊是 Flask 應用程序中常用的組件之一,它可以方便地實現用户輸入的數據驗證和處理。在 Flask 中,表單模塊通常使用 WTForms 庫實現。

下面介紹如何在 Flask 應用程序中使用表單模塊。

1)安裝 WTForms

使用 pip 安裝 WTForms: python pip install WTForms

2)創建表單類

在 Flask 應用程序中,需要定義一個表單類來描述需要接收的數據和對數據進行驗證的規則。例如下面的示例定義了一個簡單的用户註冊表單:

```python from wtforms import Form, StringField, PasswordField, validators

class RegistrationForm(Form): name = StringField('Name', [validators.Length(min=4, max=25)]) email = StringField('Email', [validators.Email()]) password = PasswordField('Password', [ validators.DataRequired(), validators.EqualTo('confirm_password', message='Passwords must match') ]) confirm_password = PasswordField('Confirm Password') `` 在上面的示例中,我們使用WTForms提供的 Form 類定義了一個表單類RegistrationForm,並定義了三個字段:nameemailpassword。對於每個字段,我們使用不同的驗證器進行驗證,例如validators.Lengthvalidators.Emailvalidators.EqualTo` 等。

3)在視圖函數中使用表單

在 Flask 應用程序中,需要使用表單類來接收用户提交的數據,然後對數據進行驗證和處理。例如下面的示例定義了一個處理用户註冊的視圖函數:

```python from flask import render_template, request from .forms import RegistrationForm

@app.route('/register', methods=['GET', 'POST']) def register(): form = RegistrationForm(request.form) if request.method == 'POST' and form.validate(): # 處理用户註冊數據 return 'Registration successful!' return render_template('register.html', form=form) `` 在上面的示例中,我們使用表單類RegistrationForm來接收用户提交的數據,然後在視圖函數中使用request.form方法獲取表單數據,並使用form.validate()` 方法驗證表單數據是否合法。如果表單數據驗證通過,則進行用户註冊操作,並返回註冊成功的消息。

4)渲染表單模板

在 Flask 應用程序中,需要使用模板引擎來渲染表單模板,並將表單類傳遞給模板。例如下面的示例定義了一個註冊表單模板:

```python

{{ form.name.label }} {{ form.name }} {{ form.email.label }} {{ form.email }} {{ form.password.label }} {{ form.password }} {{ form.confirm_password.label }} {{ form.confirm_password }}

`` 在上面的示例中,我們使用表單類RegistrationForm中的字段nameemailpasswordconfirm_password渲染表單模板,並使用form.name.labelform.name` 等屬性來獲取標籤和輸入框的 HTML 代碼。

表單模塊是 Flask 應用程序中常用的組件之一。

九、擴展模塊

在 Flask 應用程序中,擴展模塊可以幫助我們更方便地實現某些功能或解決某些問題。下面介紹一些常用的 Flask 擴展模塊。

  1. Flask-WTF:Flask-WTF 是一個 WTForms 的 Flask 擴展,它為 Flask 應用程序提供了更方便的表單處理和 CSRF 保護等功能。使用 Flask-WTF 可以大大簡化表單處理的代碼,同時提高應用程序的安全性。

  2. Flask-Login:Flask-Login 是一個用於用户身份驗證和管理的 Flask 擴展,它提供了用户登錄和登出等功能,還可以方便地管理用户狀態和權限等信息。使用 Flask-Login 可以大大簡化用户身份驗證和管理的代碼,同時提高應用程序的安全性。

  3. Flask-SQLAlchemy:Flask-SQLAlchemy 是一個 SQLAlchemy 的 Flask 擴展,它提供了對關係型數據庫的支持,例如 MySQL、PostgreSQL 和 SQLite 等。使用 Flask-SQLAlchemy 可以方便地進行數據庫操作,例如創建表、插入數據和查詢數據等。

  4. Flask-Cache:Flask-Cache 是一個緩存的 Flask 擴展,它提供了緩存功能,可以將應用程序中的一些計算結果緩存起來,以減少計算量和響應時間。使用 Flask-Cache 可以提高應用程序的性能和響應速度。

  5. Flask-Mail:Flask-Mail 是一個郵件發送的 Flask 擴展,它提供了發送郵件的功能,可以方便地發送郵件給用户或管理員等。使用 Flask-Mail 可以大大簡化發送郵件的代碼,同時提高應用程序的交互性和用户體驗。

以上是一些常用的 Flask 擴展模塊,它們可以幫助我們更方便地實現某些功能或解決某些問題。當然,還有很多其他的 Flask 擴展模塊,可以根據實際需要選擇使用。


Python Flask 介紹就先到這裏了,後續會持續更新相關技術類文章,也可關注我公眾號【大數據與雲原生技術分享】深入技術交流和問題諮詢~