iT邦幫忙

2022 iThome 鐵人賽

DAY 22
0

前言、摘要

在前幾天我們透過API建立起前端與後端,但其中還有一些不夠完整的地方,因此今天的目標包括:

  • 實作過濾器的API
  • 增加API 安全性(POST API )

本日成果

Untitled

實作過濾器的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 安全性

第二個部分是增加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會被阻止


使用Bear Token

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

參考資料

  1. Authentication - Django Ninja (rest-framework.com)
  2. Query parameters - Django Ninja (rest-framework.com)

台南不需要米其林

  1. 專案網址
  2. 專案程式碼
  3. 專案文件與鐵人賽文章
  4. 參賽團隊 台南巷弄美食獵人


上一篇
Day21 美味的終極目標
下一篇
Day23 改頭換面,實作前端介面
系列文
台南不需要米其林30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言