iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 17
1
Modern Web

瓶子裡裝甚麼藥,使用Flask輕輕鬆鬆打造一個RESTful API系列 第 17

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即可,完成結果如下圖顯示:

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

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

實作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的資料,雖然應用程序沒有故障,但是大家收到的響應應該如下圖所示:

這時先設定些初始資料來驗證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

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

實作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如下圖:

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

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

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

小結

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


上一篇
DAY15-搞懂如何建立Resource
下一篇
DAY17-搞懂flask-restful請求參數處理
系列文
瓶子裡裝甚麼藥,使用Flask輕輕鬆鬆打造一個RESTful API31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1

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

<string: name>不能有空白的樣子

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

kirai iT邦新手 4 級 ‧ 2019-09-26 21:24:19 檢舉

感謝指正

我要留言

立即登入留言