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