Site icon imageTomoMemo.dev

Memo on programming. Provided by Tomo with passion.

[CRUD]Pythonのベースとなる書き方[flask]

Icon in a callout block
Python 100Days Challenge Day28

Create, Read, Update, Deleteの書き方を理解してPythonの書き方を習得していく。

今回はflaskというフレームワークを使ってみる。Fast APIと迷ったけど、flaskのほうが手軽にできそうだったので今回はこれを選択。Fast APIはまた追々。

flaskを使ってapiをつくってみる。

Create, Read, Update, Delete、これら一連の動きができるかどうかを確認する。

flask

flaskは小規模向けの簡単なWebアプリが作れるフレームワーク。

まずは環境の構築から。

Pythonがインストールされているかを確認。

python --version
> Python *.**.*

このように返ってくるかを確認。

環境構築については省略。

次にflaskの環境をつくる。

ディレクトリを作成

mkdir python-crud

ファイルを作成

touch main.py

仮想環境を作成

python -m venv flaskapp

仮想環境を有効化する

source flaskapp/bin/activate

flaskをインストール

pip install Flask

仮想環境が有効化、立ち上がっている状態でファイルを動かす

export FLASK_APP=main
flask run

mainというのはmain.pyのファイル名です。

Running on http://***.*.*:****

こういうのが出るのでアクセスする。

ではAPIを作っていきます。

POSTMANやら、APIDOG(最近アプリ出たらしい)やら用意してたたいていきましょう。

flaskの基本設定を書いてAPIを実装していく。

from flask import Flask, jsonify, request
import logging

logも適宜出力しておくようにすると改修しやすい。

本の情報をgetする(Read)

# getメソッド
@app.route('/books', methods=['GET'])
def get_books():
    return jsonify(books)
  • /booksというURLにGETリクエストがきたとき全ての本の情報を返す
  • jsonify関数で辞書形式で作成しているデータをjson形式で返す

POSTMANで以下URLでAPIをたたく, GETメソッド

http://127.0.0.1:5000/books

これもGETメソッド

# 特定の本をIDを通して取得する
@app.route('/books/<int:book_id>', methods=['GET'])
def get_book(book_id):
    book = books.get(book_id)
    if book:
        return jsonify({book_id: book})
    return {'error': '本が見つかりません'}, 404
  • GETリクエストが来た時に特定のIDの本情報を返す

使い方はこんなURL

http://127.0.0.1:5000/books/1

新しく本を作成する

# Createメソッド
@app.route('/books', methods=['POST'])
def create_book():
    # 新規作成時に既存idの最大数に1を追加する
    new_book = {
        'id': len(books)+1,
        'name': request.json['name'],
        'email': request.json['email']
    }
    books[new_book['id']] = new_book
    return jsonify(new_book), 201

解説は省略

このURLで使える, POSTメソッド

http://127.0.0.1:5000/books

&コードを参照してjson形式でデータを作成する

PUTメソッド。使えるURLは省略。

# Updateメソッド
@app.route('/books/<int:book_id>', methods=['PUT'])
def update_book(book_id):
    book = books.get(book_id)
    if book:
        book['name']=request.json.get('name', book['name'])
        book['email']=request.json.get('email', book['email'])
        return jsonify(book)
    return jsonify({'error': '本が見つかりません'}), 404

DELETEメソッドはこちら。

# Deleteメソッド
@app.route('/books/<int:book_id>', methods=['DELETE'])
def delete_book(book_id):
    if book_id in books:
        del books[book_id]
        return jsonify({'data': '本の削除が成功しました'})
    return jsonify({'error': '本が見つかりません'}), 404

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

Pythonファイルが直接実行されたときにFlaskアプリを起動する。

デバッグをTrueにしているのでエラーメッセージが詳細に表示される。

もちろん自分でログを仕込んでもOK

仮想環境を無効化はこれ

deactivave

ソースコードはこちら

https://github.com/tomohiro-dev/python-crud-api

あとがき

ちなみに、フレームワークとライブラリのちがいについて。

  • フレームワーク
    • アプリケーションを作るための「骨組み」。
    • 例えば、家を建てるときに、最初から家の枠組みができている状態がフレームワーク。その枠組みに部屋や家具を追加していくだけで、家が完成する。
    • : Django, Flask

    つまり、ゼロからすべてを作る必要はなく、すでに用意されている基本的な部分を使って、自分が追加したい機能だけを作ればいいので開発スピードが上がる。

  • ライブラリ
    • プログラミングを簡単にするための「道具」。
    • 例えば、料理をするときに使う調味料や調理器具のセットがいわゆるライブラリ。これを使えば、同じ料理を一から作るよりも簡単に美味しい料理が作れる。
    • : React.js, Next.js

    つまり、ライブラリにある道具(関数やクラス)を使って、自分の作りたい機能をすばやく作り上げることができる。フレームワーク内でライブラリはあらかじめ準備されていることが多い。例えば、LaravelはjavaScriptのライブラリ、Vue.jsやReact.jsの環境構築ができる。(Next.jsもできるかも?知らんけど)

Powered by Tomo with passion.