在前幾天我們透過API建立起前端與後端,但其中還有一些不夠完整的地方,因此今天的目標包括:
改成以API傳遞資料後,收Request中的參數的方式會有點不一樣。Ninja API對於url中自訂的參數都以query的方式解讀,因此我們要在實作API的時候寫入這些參數的名稱。
我們對places
這個function稍做修改:
@api.get(
"places",
response=List[PlacesSchema])
def places(request, food_style:str=None):
這邊加入的food_style
的參數就是我們在form_filter
中所設定的值,型別是字串,而當使用者還沒送出搜尋時不會收到這項參數,因此我們需要給訂一個預設值。
接著當我們收到參數時,將food_style
作為篩選值丟入資料庫中撈出對應的店家,如果參數為None則回傳所有店家。
if food_style:
places = Place.objects.prefetch_related('photo_set', 'tag').filter(tag__style=food_style)
else:
places = Place.objects.prefetch_related('photo_set', 'tag').all()
在API的頁面上實驗剛剛新增的功能
當url中沒有指定tag時回傳所有店家
當指定food_style
的值時則回傳對應的結果。
第二個部分是增加API的安全性,之前我們實作過POST API,這使得他人可以任意往資料庫中新增資料,因此我們需要為API增加權限的限制。
在安全性的部分,有兩種常見的方式,第一種是使用密碼,輸入密碼後才能夠執行API。第二種是JSON Web Token,設定一串英文數字作為token,在有效時間內可以透過Token存取資料。
而今天要實作的是第一種
class BasicAuth(HttpBasicAuth):
def authenticate(self, request, username, password):
user = authenticate(username=username, password=password)
@api.post("/tags", auth=BasicAuth())
這時候如果我們想要新增tag會被阻止
在api.py
中importHttpBearer
,並建立一組授權機制:
from ninja.security import HttpBearer
class AuthBearer(HttpBearer):
def authenticate(self, request, token):
if token == "supersecret":
return token
將AuthBearer
加入新增tag的API中:
@api.post("/tags", auth=AuthBearer())
def add_tag(request, tag: Tags):
接著我們打開API的介面就可以看到剛剛新增的授權機制囉~
輸入token後才能夠執行API
台南不需要米其林
- 專案網址
- 專案程式碼
- 專案文件與鐵人賽文章
- 參賽團隊 台南巷弄美食獵人