Flask 中的 HTTP 方法
上一個小節(jié)中我們創(chuàng)建了第一個 Flask 程序,并且在瀏覽器中成功看到了 Flask 程序給我們返回的 Hello World。但是你有沒有注意到,我們看到的內(nèi)容只是在后臺進行寫死的,也就是說無論你怎么請求,看到的永遠是 Hello World,無法根據(jù)自己的需求讓 Flask 程序返回給你想要的內(nèi)容?
這該怎么辦呢?
不要急,我們有 HTTP 協(xié)議,HTTP 協(xié)議提供了多種方法訪問服務端資源,本小節(jié)講解常用的 HTTP 方法。并通過一個個具體的例子,說明如何在 Flask 中使用不同的 HTTP 方法。
Tips:本節(jié)課所有代碼已經(jīng)上傳到了 Github,可以點擊這里進行下載。
1. HTTP 協(xié)議簡介
1.1 概述
HTTP 協(xié)議是 Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫, 用于從萬維網(wǎng)(World Wide Web)服務器傳輸超文本到本地瀏覽器的傳送協(xié)議。
HTTP 協(xié)議工作于客戶端-服務端架構為上。瀏覽器作為 HTTP 客戶端通過 URL 向 服務端發(fā)送請求,服務端根據(jù)接收到的請求 URL,向客戶端發(fā)送響應信息。HTTP 請求-響應模型如下所示:
1.2 HTTP 請求消息
HTTP 協(xié)議是一個簡單的請求-響應協(xié)議,它指定了客戶端可能發(fā)送給服務器什么樣的消息以及得到什么樣的響應。請求和響應消息的頭以 ASCII 碼形式給出;而消息內(nèi)容則具有一個類似 MIME 的格式。
瀏覽器向 Web 服務器發(fā)出請求時,它向服務器傳遞了一個請求信息,HTTP 請求信息由 3 部分組成:
- 請求行;
- 請求頭;
- 請求正文。
以下是一個 HTTP 請求消息的例子:
GET / HTTP/1.1
Host: idcbgp.cn
Connection: keep-alive
User-Agent: Mozilla/5.0 AppleWebKit/537.36 Chrome/81.0
Accept: text/html,application/xml;image/webp,image/png,*/*;
...
省略
...
第一行是請求行,用來說明請求方法,要訪問的資源,以及所使用的 HTTP 版本。在這個例子中,請求方法是 GET,要訪問的資源是 /,HTTP 版本是 1.1,表示要獲取網(wǎng)站首頁 / 的內(nèi)容。
緊接著請求行之后的部分是請求頭部,用來說明服務器要使用的附加信息。例如:Host 指出請求的主機名,這里是 idcbgp.cn。
請求頭部之后是請求正文,在請求正文中可以添加任意的其他數(shù)據(jù),這個例子的請求正文為空。
1.3 常用的 HTTP 方法
根據(jù) HTTP 標準,常用的 HTTP 請求如下所示:
請求方法 | 功能 |
---|---|
GET | 請求指定 URL 的頁面,這是最常見的方法 |
HEAD | 類似于 GET 請求,但返回的響應中沒有具體的內(nèi)容,用于獲取報頭 |
POST | 向指定 URL 的頁面提交數(shù)據(jù)進行處理請求,例如提交表單或者上傳文件 |
PUT | 從客戶端向服務器傳送數(shù)據(jù),取代指定 URL 的頁面 |
DELETE | 請求服務器刪除指定 URL 的頁面 |
3. Flask 中的 HTTP 方法
上面我們已經(jīng)大概了解了什么是 HTTP 協(xié)議,簡單來說就是客戶端與服務端用來通信的協(xié)議,HTTP 協(xié)議中規(guī)定和很多 HTTP 方法來讓我們根據(jù)不同的需求向服務端發(fā)起請求。下面我們通過一個具體的例子,說明如何在 Flask 中使用不同的 HTTP 方法:
from flask import Flask, request
app = Flask(__name__)
首先,導入類 flask.Flask 和 flask.request,request 封裝了請求消息,可以獲取請求的各種參數(shù)。
@app.route('/login', methods = ['GET'])
def login():
return '''
<form action="/check_login" method="POST">
<p><input type="text" name="name"/></p>
<p><input type="password" name="password"/></p>
<p><input type="submit" value="submit"/></p>
</form>
'''
定義處理路徑 /login 的函數(shù) login,裝飾器 @app.route(’/login’, methods = [‘GET’]) 表示使用 GET 方法處理路徑 /login 的請求。
函數(shù) login 返回一段用于登錄的 HTML 表單,表單包括 2 個字段: name 和 password。在第 4 行,指定使用 POST 方法提交表單給服務端的 /check_login 頁面。
@app.route('/check_login', methods = ['POST'])
def check_login():
name = request.form['name']
password = request.form['password']
if name == 'guest' and password == '123':
return 'Login succeed'
else:
return 'Login failed'
定義處理路徑 /check_login 的函數(shù) check_login,裝飾器 @app.route(’/check_login’, methods = [‘POST’]) 表示使用 POST 方法處理路徑 /check_login 的請求。
函數(shù) check_login 根據(jù)請求的參數(shù) name 和 password 是否正確,返回給用戶相應的信息。在第 3 行,提取參數(shù) name 的值,在第 4 行,提取參數(shù) password 的值。如果 name 是 guest,password 是 123,則返回登錄成功消息,否則返回登錄失敗消息。
if __name__ == '__main__':
app.run()
調(diào)用 app.run() 運行程序。用戶在瀏覽器中輸入 http://localhost:5000/login,瀏覽器顯示:
用戶輸入正確的 name 和 password 后,瀏覽器跳轉到頁面 http://localhost:5000/check_login,顯示:
4. 小結
本節(jié)講解了 HTTP 協(xié)議中的不同方法,通過一個具體的例子,講解在 Flask 應用中,如何處理指定 HTTP 方法的請求。對常用的 HTTP 方法,使用思維導圖概括如下: