---
# System prepended metadata

title: Python進階應用 - API (05/14)
tags: [api, python]

---

# 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`