Flask REST APIs

   อัปเดตล่าสุด April 30, 2024

การทำ APIs ด้วย Flask นั้นก็สะดวก ง่าย และรวดเร็ว ไม่เปลืองทรัพยากรอะไรมากมาย ซึ่งก็ค่อนข้าง Lightweight ดังคอนเซ็ปต์ไมโครเฟรมเวิร์กของ Flask เลยครับ ซึ่ง Flask ก็มีคุณสมบัติครบตามที่เว็บเฟรมเวิร์กควรจะมีเลย หลัก ๆ นั่นก็คือการจัดการกับ Request ที่เข้ามาจากฝั่ง Client และมีการ Response ข้อมูลกลับไปที่ clients


เริ่มสร้าง REST API ด้วย Flask

สร้าง Mock-up data ขึ้นมาเพื่อทดสอบ API โดยจะเก็บในรูปแบบ List ที่มีชื่อว่า  data   แล้วใน List ก็จะเก็บแยกเป็น Dictionary เพื่อเก็บข้อมูลเฉพาะของแต่ละเว็บเฟรมเวิร์ค ในรูปแบบของ {‘Key’: ‘Value’}โดยข้อมูลก็จะมีดังนี้

data = [
{
"id": 1,
"frameworks": "Django",
"year": 2005
},
{
"id": 2,
"frameworks": "Flask",
"year": 2010
},
{
"id": 3,
"frameworks": "Web2Py",
"year": 2007
}
]


Response ข้อมูลไปให้ client

ข้อมูลเหล่านี้ที่จะถูก response กลับไปที่ฝั่ง Client ในรูปแบบของ JSON(JavaScript Object Notation) ซึ่งเป็นมาตรฐานการรับส่งข้อมูล ที่ได้รับความนิยมสูงสุดในปัจจุบัน 

โดยเราก็จะต้องทำการแปลงข้อมูลที่อยู่ใน List ของเราที่เก็บไว้ในตัวแปร data ไปเป็น JSON ด้วยเมธอด  jsonify  ก็ทำการอิมพอร์ตเข้ามาใช้งานได้เลยครับ

from flask import Flask, jsonify


จากนั้นเขียนฟังก์ชันและสร้าง route ขึ้นมาใหม่ โดยกำหนด URL end-point ชื่อว่า  /api โดยตัวเมธอดใน URL ก็จะเป็นเมธอด GET นั่นก็คือ Client สามารถเรียกดูข้อมูลนี้ได้เท่านั้น ไม่สามารถทำอย่างอื่น เช่น เพิ่ม แก้ไข หรือลบข้อมูล ที่อยู่ใน end-point นี้ 
@app.route('/api', methods=['GET'])
def get_api():
return jsonify(data), 200 # response data
จาก route ด้านบนนี้เป็นการแสดงผล data ทั้งหมด โดยจะถูก return ออกไปให้ client ด้วย end-point คือ
http://127.0.0.1:5000/api

แต่ถ้าต้องการเข้าถึงข้อมูลแต่ละ ID ล่ะ? 
ก็จะได้โค้ดประมาณนี้ครับ ในตัวอย่างนี้ ผมได้เพิ่ม Endpoint ใหม่เพื่อค้นหา Framework ด้วย ID โดยใช้ URL Parameter ในกรณีที่ไม่พบ Framework ตามที่ระบุ ก็จะคืนข้อความผิดพลาดพร้อม Status Code 404 (Not Found) ให้ Client ทราบ
@app.route('/api/<int:fw_id>', methods=['GET'])
def get_fw(fw_id):
"""
This endpoint returns a specific framework by ID.
"""
fw = [fw for fw in data if fw['id'] == fw_id]
if len(fw) == 0:
return jsonify({'error': 'Framework not found'}), 404
return jsonify(fw[0]), 200
อธิบายโค้ด
  • ใช้ Decorator @app.route  เพื่อกำหนด URL ของ Endpoint นี้ โดยใช้ URL Parameter ชื่อ  fw_id  ซึ่งเป็นตัวเลขจำนวนเต็ม (int) เพื่อระบุ ID ของ Framework ที่ต้องการดึงข้อมู
  • กำหนด HTTP Method สำหรับ Endpoint นี้เป็น  GET  เพื่อให้ Client สามารถดึงข้อมูลได้อย่างเดียว ไม่สามารถแก้ไขหรือลบข้อมูลผ่าน Endpoint นี้ได้
  • ฟังก์ชัน  get_fw  จะรับ Argument  fw_id  ซึ่งเป็น ID ของ Framework ที่ต้องการ จากนั้นจะค้นหา Framework ใน List ของ data ที่มี id ตรงกับ  fw_id 
  • ถ้าไม่พบ Framework ที่มี ID ตรงกับ  fw_id  จะคืนค่า Error Message และ Status Code 404 (Not Found) กลับไปให้ Client
  • แต่ถ้าพบ Framework ที่ตรงกับ ID ก็จะคืนข้อมูลของ Framework นั้นในรูปแบบ JSON พร้อมกับ Status Code 200 (OK)

Final Code

from flask import Flask, jsonify

app = Flask(__name__)

data = [
{
"id": 1,
"frameworks": "Django",
"year": 2005
},
{
"id": 2,
"frameworks": "Flask",
"year": 2010
},
{
"id": 3,
"frameworks": "Web2Py",
"year": 2007
}
]

@app.route('/')
def home():
return "Hello World"


@app.route('/api', methods=['GET'])
def get_api():
return jsonify(data), 200


@app.route('/api/<int:fw_id>', methods=['GET'])
def get_fw(fw_id):
"""
This endpoint returns a specific framework by ID.
"""
fw = [fw for fw in data if fw['id'] == fw_id]
if len(fw) == 0:
return jsonify({'error': 'Framework not found'}), 404
return jsonify(fw[0]), 200


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


รัน Flask Server

$ python app.py


จากนั้นเข้าไปที่ URL 

http://127.0.0.1:5000/api




และลองทดสอบเข้าไปที่ URL  ของฟังก์ชันที่เข้าถึงแต่ละ ID ดูครับว่าได้ข้อมูลแบบไหนกลับมา

เพียงเท่านี้ก็ถือว่าเราได้สร้าง REST API ด้วย Flask Python สำเร็จแล้วครับ ถึงแม้ว่าใน API endpoint นี้จะมีเพียงแค่ดึงข้อมูล (GET) แต่ก็ถือว่าเป็นจุดเริ่มต้นที่ดี ให้เราต่อยอดไปในระดับสูงขึ้นในบทเรียนถัดไปก็จะเป็นการสร้าง API ที่มีความซับซ้อนมากขึ้น



คอร์สเรียนแนะนำ