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的開發。

官網:https://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:[email protected]/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 介紹就先到這裡了,後續會持續更新相關技術類文章,也可關注我公眾號【大資料與雲原生技術分享】深入技術交流和問題諮詢~