iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 30
2

更進一步介紹Flask-Jwt-Extended

昨日的教程教授大家如何安裝Flask-Jwt-Extended以及其基本的用法,今日的教程要教授大家其進階用法以及如何導入現有專案解決我們遇到的問題。

本文章同步放置於此

進階用法

Flask-Jwt-Extended的內容有很多,例如刷新access_token以及偵測其是否失效,不過今日筆者僅說明如何放置客製化資訊到access_token內,以及如何取回該資訊,若是讀者對於其他內容有興趣可以到官網看看。

儲存客製化參數

這裡實作user_claims_loader攔截create_access_token的方法,並將所接收到的identity轉換成我們想要提供給client端的token格式。

    @jwt.user_claims_loader
    def add_claims_to_access_token(identity):
        return {
            'identity': identity['name'],
            'user_id': identity['id']
        }

注意這邊的identity需要是json結構,否則會執行錯誤,所以我們搭配之前的user_schema將user資料dump成JSON結構。

        access_token = create_access_token(
            identity=user_schema.dump(user).data)

取得客製化參數

在Resource中要取得客製化參數只需要使用下列方法即可:

from flask_jwt_extended import jwt_required, get_jwt_claims

claims = get_jwt_claims()

其中claims就是會從返還給client端的access_token解析並取得上述的user_claims_loader內的return結果。

導入到既有專案

進階用法說明完了之後我們再來回到最初的需求,那就是在貼文時先驗證使用者資料,並且直接取得使用者id而非透過使用者自行輸入,所以接下來我們將Flask-Jwt-Extended導入現有專案之中吧。

修改PostResource

所以這部分只需在,PostResource的post方法修改如下即可:

    @jwt_required
    def post(self, id):
        claims = get_jwt_claims()
        result = post_schema.load(Utility.get_param())

        if len(result.errors) > 0:
            return result.errors, 433

        post = PostModel(result.data['title'],
                         result.data['content'],
                         claims['user_id'])
        post.add_post()
        return {
            'message': 'Insert post success',
            'post': post_schema.dump(post).data
        }

異常狀況處理

昨日教程中有教授透過flask的設定檔來設定自動處理異常狀況,但是系統自訂義的異常狀況訊息不是所有人都看的懂的,所以接下來要教授大家如何自訂義異常狀況發生時所返回的訊息。

errors = {
    'DecodeError': {
        'message': "access_token is invalidate",
        'status': 409,
    }
}

api = Api(app, errors=errors)

如此只要當access_token沒有輸入或是格式有問題將不會出現internal server error的訊息,而會被access_token is invalidate取代。

小結

今日的教程教授大家Flask-Jwt-Extended的進階用法,並教授大家如何導入到現有專案之中。明日就來說說筆者是為什麼接觸flask-restful的吧,敬請期待。


上一篇
DAY28-搞懂Flask-JWT-Extended
下一篇
DAY30-搞懂Requests與lxml
系列文
瓶子裡裝甚麼藥,使用Flask輕輕鬆鬆打造一個RESTful API31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Neal
iT邦新手 5 級 ‧ 2023-08-22 10:38:36

新版的 flask-jwt-extended 使用 get_jwt() 取代了原本的 get_jwt_claims()
其他的基本沒有改變

kirai iT邦新手 4 級 ‧ 2023-08-22 12:11:05 檢舉

感謝回覆告知,沒想到五年前的文章還有人在看

我要留言

立即登入留言