昨天我們快速建立了我們的第一個後端 (其中包含了一支 API),現在讓我們來仔細看一下 main.py
的內容到底在做什麼。等到理解它背後的邏輯之後,就可以開始嘗試修改了~
先來仔細看一下這部分
@app.get("/")
async def root():
return {"message": "Hello World"}
上面這段程式翻成中文就是
當我們的 app (FastAPI 物件) 收到「HTTP 方法為 GET」且「路由為 "/"」的請求時,以異步的方式執行
root
函數,而這個root
函數會回傳內容為{"message": "Hello World"}
的回應給前端
哇!好多新名詞...
讓我們來簡單地解釋一下 (順序有稍微調整過,比較方便理解)
當使用者透過瀏覽器進入某個網址時,就是向網頁的伺服器發出一個「請求」(Request),伺服器收到請求後,就會回傳一個「回應」(Response)。而這個回應通常會是一個 HTML 格式的內容,瀏覽器就會把它呈現在畫面上。
若要描述精確一點的話,這邊應該是 HTTP 請求、HTTP 回應,但這邊就以最常見的 HTTP 為主,所以就把 HTTP 省略掉不寫
使用者在發送請求時,除了要指定位置 (例如:網址) 之外,也要指定他要使用哪種 HTTP 方法。如果是單純使用瀏覽器瀏覽網站的話,就會是使用 GET,通常是在想要取得某些資料時會使用它,例如:請求網頁、進行搜尋。其他方法 (例如:POST、DELETE) 則通常是有其他目的才會使用到,例如:新增資料、刪除資料。
可以參考這份官方文件,它有列出並說明各個方法的意義。
在介紹路由 (Route) 之前,我們先來看一下網址下面這個網址https://ithelp.ithome.com.tw/users/20162280/ironman/6767
可以簡單地分成三個部分
https
ithelp.ithome.com.tw
/users/20162280/ironman/6767
簡單來說,路由就是負責區分各個功能位置,讓後端可以根據位置找到對應的程式,來進行它應該要做的事情
一般程式碼在執行的時候,會一行一行的執行,一次只處理一件事情。但如果後端一次只處理一個請求,後續的請求都必須等前面的請求處理好才能開始,就會造成大塞車
就像在點餐時,櫃檯只有一個人,但排隊的隊伍大排長龍
因此,透過設定異步處理,就能讓後端同時處理多個請求,減少等待時間
就像多了好幾個點餐櫃檯
FastAPI 官網對此有很詳細的圖文介紹,我個人覺得寫得很好,歡迎大家去看看XD
知道 main.py
在設定了什麼後,接下來讓我們重新思考一下我們做了什麼才看到 {"message": "Hello World"}
首先,我們打開了瀏覽器,輸入網址 http://127.0.0.1:8000
後送出,之後就看到 {"message": "Hello World"}
了
當我們打開瀏覽器,輸入 http://127.0.0.1:8000
並送出後,瀏覽器向後端送出 GET 請求,後端比對後發現,有符合它的路由設定,對應的是 root
函數,而這個函數的回應是 {"message": "Hello World"}
,瀏覽器收到回應後,把它呈現在畫面上。
以上,這就是為什麼我們進到 http://127.0.0.1:8000
後,會看到 {"message": "Hello World"}
的原因了
走過整個基本的流程之後,再來就是看怎麼修改設定了
再看一次這段程式
@app.get("/")
async def root():
return {"message": "Hello World"}
只要把 get
換成其他方法就好,例如:post
、delete
、put
@app.delete("/")
async def root():
return {"message": "You deleted something!"}
但這邊沒辦法靠瀏覽器去觸發 GET 以外的方法,會在後續文章介紹怎麼測試上面這段程式
把 /
換成其他路徑即可
@app.get("/users/20162280/ironman/6767")
async def root():
return {"message": "Hi user~"}
此時,重新啟動程式後,並進入 http://127.0.0.1:8000/users/20162280/ironman/6767
就可以看到剛剛改動的結果
此外,也可以發現原本的網址 http://127.0.0.1:8000
的畫面則變成這樣
這是因為後端找不到這個位置對應的要執行的程式 (因為沒設定,被我們改掉了),就會回傳這個預設的錯誤訊息給前端
但有的時候,我們的網址希望這個路由其中一部分不用是固定的 (例如:商品編號),但都做一樣的處理,則可以這樣設定
@app.get("/users/{user_id}")
async def root(user_id):
return {"message": f"Hi user {user_id}"}
今天就先介紹到這邊,上面我們介紹了
main.py
內的程式內容明天會開始介紹應該要怎麼設計路由~
文章怎麼越寫越長了...