第十屆鐵人賽 flask-restful DAY16-搞懂Url Routing的參數處理

來做個使用者CRUD

昨日教授大家如何初始化flask-restful以及建立第一個Resource,到目前flask-restful的基本知識以經教授一半了,今天在繼續教授其他基本知識。

User基本結構

首先定義一個User這個Resource的基本結構,內容如下列例子:

from flask_restful import Resource 

class User (Resource):
    def get(self, name):
        pass

    def post(self, name):
        pass

    def put(self, name):
        pass

    def delete(self, name):
        pass

讀者們可以把這內容複製貼上一個放在resource資料夾內的user.py`,這邊先說明一下`pass如同其字面上的意思就是不做任何事情,我們僅是先把框架定義好而已。

註冊Resource

昨日的教程已有教授如何註冊Resource,不過如何將name由url帶入方法內呢?所以接下來更進一步教授如何綁定url上的變數,請大家先看看以下例子:

from flask import Flask
from flask_restful import Api

from resources.user import User

app = Flask(__name__)
api = Api(app)

api.add_resource(User, "/user/<string:name>")

if __name__ == "__main__":
    app.run()

如此可以把User`綁定到url`/user/`上面去,而最後一個內容會轉型成字串傳遞給方法當作是`name的變數。

完成Resource以及綁定User後,接下來有兩個選擇,繼續實作其內容,或是先把POSTMAN設定好,在此筆者頃向先設置POSTMAN再來一一完成user的method。

設定POSTMAN

由於url上需要提交name`,這裡為了方便我們也把`name加到環境變數並設定好對應的四個方法的請求資料,相信經過昨日的教程應該難不倒讀者,若是有困難的讀者在複習一下:

首先先點擊眼睛`看到環境變數的視窗,在按下`EDIT`的按鈕開始修改,最後加入`name即可,完成結果如下圖顯示:

POSTMAN 環境變數設定視窗

接下來設定四個請求的url如下列四圖所示:

這時可以按下SEND,相信響應應該沒有任何東西,如果有錯誤內容請回覆告知喔,因為你遇到問題了。接下來就開始實作以下內容了。

POSTMAN API無回應的響應

實作GET方法

相信教經過昨日的教程各位讀者已經可以獨自完成get這方法,不過還不熟的讀者可以參考我的方法實作,在此筆者先用一個list來存放使用者資料,但是重新啟動伺服器後所有資料就不存在,不過沒關係,目前先專注在api開發,30日教程內筆者會帶大家如何搭配資料庫,所以先以下列方式來實作:

from flask_restful import Resource

users = []

class User (Resource):

    def get(self, name):
        find = [item for item in users if item['name'] == name]
        if len(find) == 0:
            return {
                'message': 'username not exist!'
            }, 403
        user = find[0]
        if not user:
            return {
                'message': 'username not exist!'
            }, 403
        return {
            'message': '',
            'user': user
        }

    def post(self, name):
        pass

    def put(self, name):
        pass

    def delete(self, name):
        pass

透過list comprehension找到name相同的資料並且返回該筆資料,待之後介紹與db介接之時再調整此程序。就這樣Resource的get部分實作完成了。

使用POSTMAN

使用後相信大家應該都找不到對應name的資料,雖然應用程序沒有故障,但是大家收到的響應應該如下圖所示:

POSTMAN 請求使用者資料返還查無資料視窗

這時先設定些初始資料來驗證get`方法,此時我們再將上述`user.py加以調整如下:

from flask_restful import Resource

users = [{
    'name': 'kirai',
}]

class User (Resource):

    def get(self, name):
        find = [item for item in users if item['name'] == name]
        if len(find) == 0:
            return {
                'message': 'username not exist!'
            }, 403
        user = find[0]
        if not user:
            return {
                'message': 'username not exist!'
            }, 403
        return {
            'message': '',
            'user': user
        }

    def post(self, name):
        pass

    def put(self, name):
        pass

    def delete(self, name):
        pass

如此應該可以找到一筆資料,所以在請求一次應該能看到以下響應:

POSTMAN 查詢使用者返還查詢結果視窗

實作DELETE

相信實作完get後很多讀者已經知道如何實作delete,如果還沒想法的讀者也別難過繼續看下列例子,想想自己哪裡還不熟的。

from flask_restful import Resource

users = [{
    'name': 'kirai',
}]

class User (Resource):

    def get(self, name):
        find = [item for item in users if item['name'] == name]
        if len(find) == 0:
            return {
                'message': 'username not exist!'
            }, 403
        user = find[0]
        if not user:
            return {
                'message': 'username not exist!'
            }, 403
        return {
            'message': '',
            'user': user
        }

    def post(self, name):
        pass

    def put(self, name):
        pass

    def delete(self, name):
        global users
        users = [item for item in users if item['name'] != name]
        return {
            'message': 'Delete done!'
        }

處理完成後就準備POSTMAN伺候了,首先選定目標url如下圖:

相信提交請求之後會收到下列響應:

POSTMAN 刪除使用者請求返還結果

但是真的刪除了嗎?這時再提交一次GET的請求,並確認響應如下:

POSTMAN 刪除使用者後請求使用者返還結果

這裡我們可以真的確定該user已經被刪除了。

小結

今日完成CRUD的R及D明日繼續C跟U,在處理C跟U時會介紹如何處理請求傳輸的參數以及POSTMAN如何傳遞參數,敬請期待。

在〈第十屆鐵人賽 flask-restful DAY16-搞懂Url Routing的參數處理〉中有 4 則留言

  1. 版主您好,我在執行時遇到no module named “resources.user”
    查看PACKAGE CONTENTS後發現只有, client manager resource
    想請問該如何處理呢? 謝謝

    1. resource.user在我的範例中是resource這個資料夾的user.py這檔案,你可以檢查你的資料夾是否是resources,還是是像我一樣用resource

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *