iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
自我挑戰組

web 應用開發筆記系列 第 8

[Day 8] 技能前哨站 - Web 後端大補帖(下)

  • 分享至 

  • xImage
  •  

上一篇規劃完後就該來一步步完成 todo list API 了,使用 Flask 框架能及幫助我們在短時間內建立一個簡易的 API 專案,基於 MVC 架構我們會將負責處理資料儲存的 model 與控制資料的 Controller 及使用者介面的 Views 分開,在 model 的資料處理上我們會使用 peewee 作為我們的 ORM(Object Relational Mapping) 套件,話不多說,開始實作吧~

實作

建立 Flask 專案

$ mkdir todo_list_backend

建立 flask app 檔案

$ touch app.py
from flask import Flask
from flask_cors import CORS

def create_app():
	app = Flask(__name__)
	CORS(app)

	@app.route('/', methods=['GET'])
	def home():
		return "<h1>Hello Flask!</h1>"
	
	return app

設計檔案結構

  • src
    • models
      • base.py - 設定 peewee 連線 MySQL 實體
      • task.py - 撰寫 task table 的內容
    • resource
      • task.py - 撰寫 request/response 邏輯
    • routes
      • router - 撰寫 API 的定址
  • .env - 設定必要的環境變數,包括 DB 連線資訊
  • app.py - flask app
  • config.py - 設定環境變數作為 python 變數供 model 取用

目錄

撰寫 model

  • src/models/base.py
from peewee import MySQLDatabase, Model, DateTimeField
from datetime import datetime
from config import Config

def connection_resolver():
    return MySQLDatabase(
        Config.DB_NAME,
        user=Config.DB_USERNAME,
        password=Config.DB_PASSWORD,
        host=Config.DB_HOST,
        port=3306,
        autorollback=True
    )

connection = connection_resolver()

class BaseModel(Model):
    created_at = DateTimeField(default=datetime.now)
    updated_at = DateTimeField(default=datetime.now)

    def save(self, *args, **kwargs):
        self.updated_at = datetime.now()
        return super(BaseModel, self).save(*args, **kwargs)

    class Meta:
        database = connection

  • src/models/task.py
from .base import BaseModel
from peewee import CharField, IntegerField, DateTimeField

class Task(BaseModel):
    name = CharField()
    finish_at = DateTimeField(null=True)
    deleted_at = IntegerField(default=-1)

    class Meta:
        indexes = [
            (('name', ), True),
        ]

撰寫 task 的 request/response 邏輯

  • src/resource/task.py
from flask_restful import Resource, reqparse
from src.models import Task

class TaskList(Resource):
    parser = reqparse.RequestParser()
    parser.add_argument('name', type=str, required=True,)

    def post(self):
        data = TaskList.parser.parse_args()
        status = 200
        message = '新增成功'
        try:
            name = data['name']
            task_id = Task.create(name=name)
        except Exception as e:
            status = 409
            message = '新增失敗'
        return {
            'message': message,
        }, status

先撰寫 /tasks [POST] 的功能,輸入任務名稱可以新增一筆任務資訊至資料庫

撰寫 router

  • src/routes/router.py
from flask import Blueprint
from flask_restful import Api
from src.resource.task import TaskList

api_bp = Blueprint('api', __name__)
api = Api(api_bp)


@api_bp.route('/')
def show():
    return "this is todo list API"

api.add_resource(TaskList, '/tasks')

將 app.py 改寫

from flask import Flask
from flask_cors import CORS
from src.routes.router import api_bp


def create_app():
    app = Flask(__name__)
    CORS(app)

    @app.route('/', methods=['GET'])
    def home():
        return "<h1>Hello Flask!</h1>"

    app.register_blueprint(api_bp, url_prefix='/api')

    return app

結果

啟動 flask 應用

$ python3 -m flask run --host=0.0.0.0 --port=80

使用 postman 來測試 API

api

使用 MySQL 檢視工具來查看資料庫內容

mysql

如此一來,簡易的 flask todo list API初步就算完成,下一篇會將剩餘的 API 做完並殃前端串接完成


上一篇
[Day 7] 技能前哨站 - Web 後端大補帖(中)
下一篇
[Day 9] 技能前哨站 - Web 全端大補帖
系列文
web 應用開發筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言