# Python進階應用 - API (05/14) [課程共筆](https://hackmd.io/z8eShyg8R6ior8sWugK2Xw) * 裝飾器 decorator:@函式名稱 須將函式包成兩層,寫成wrapper才能用裝飾器 * 新增Singlemember、Login的Class為API。 * 使用jwt產生的token可以貼到jwo.io看解析回來的資料。寫Login的API時經常需使用token確認仍為登入狀態 * 若要在API中有token才能執行,先在程式碼中from flask_jwt_extended import jwt_required,然後在該func前一行加入裝飾器@jwt_required(),最後在postman中,環境變數加上token值,打api時,在header的authorization中type選bearer token,右邊token欄位打{{環境變數}} * 寫Swagger文件 1. 在api.py增加swagger的config資料 2. 新增一個class在route_model.py,要跟member.py同一層 3. 修改member.py,要import route_model、from flask_apispec import MethodResource, marshal_with, doc, use_kwargs,在Class宣告時,函式前面加三行(見本段尾端範例code),則原本用parser與args取得資料的方式就可直接取用kwargs['account']與kwargs['password'],另外在Class傳入的參數要由Resource改為MethodResource 4. 在SingleMember的部分,id已設定為必填欄位,可以不用放到kwarg內。 5. 若在Swagger裡面要加上有帶Token時API才能打成功,則需 ** 修改api.py,config加上securityDefinitions參數 ** 此時,在Swagger頁面表頭就會多一個Authorization的鎖頭按鈕 ![](https://hackmd.io/_uploads/B1L3wXR4h.png) ** 接著修改member.py,增加變數security_params = [{"bearer": []}],在每個函式的@doc內增加參數security=security_params,則Swagger頁面API尾端就會出現鎖頭 ![](https://hackmd.io/_uploads/ryz9dX0E2.png) ** 點下按鈕後在Value空格內填入 Bearer Token值,則執行API時就會自動吃到Token資料。 ``` @doc(description="login API", tags=['Login']) @use_kwargs(route_model.LoginSchema, location="form") #get的location要寫query @marshal_with(route_model.LoginResponse, code=200) ``` * 在Postman中,若要自動打login api後取得的token值存入環境變數,可在login的api,Head的Tests欄位中寫入JS,Code如下: ``` pm.test("JWT Token 檢查", function () { pm.environment.set("token", pm.response.json().token) }); ``` ###### tags: `python` `api`