Python学習【365日チャレンジ!】168日目のマスターU(@Udemy11)です。

先日購入した【アースサラテクトミストリッチリッチ30】が届いたので、早速使ってみたところ、信じられないくらい蚊に刺されませんでした。

サラテクトミストリッチリッチ30

ほんと嘘みたいなホントの話で、手放せないアイテムになりそうです。

まだ1回しか使用していないので、たまたま蚊がいなかっただけかもしれませんので、使いつつ、その効果を確認してみようと思います。

それでは今日もPython学習を始めましょう。

昨日の復習

昨日は、Flaskを使ってHTTPメソッドを操作する方法を学習しました。

requestをインポートして、デコレーターに追加アドレスを指定して、引数methodにHTTPメソッドを指定すれば、クライアントからのリクエストに対応することができました。

詳しくは、昨日の記事をごらんください。

今日は、FlaskでSQLiteを操作してみます。

コネクションの作成とクローズ

今回は、SQLiteを使ってデータベースの操作をするので、sqlite3をインポートします。

あとは、Flaskとデータベースのコネクタに情報を保存するためのflaskのgオブジェクト、requestオブジェクトをインポートしてコードを書いていきます。

import sqlite3

from flask import Flask
from flask import g
from flask import request


app = Flask(__name__)


def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._databese = sqlite3.connect('test_sqlite.db')
    return db

@app.teardown_appcontext
def close_connection(exception):
    db = getattr(g, '_database', None)
    if db is not None:
        db.close()

まず最初にサーバーを走らせるためのappを定義するのは昨日までと同じです。

11行目から15行目は、データベースを確認して、存在すればデータベースを返して、なければコネクタを作成するというFlaskでデータベースを扱う際のフォーマット的な関数のコードになります。

17行目から21行目は、データベースのコネクタが存在する場合には、そのコネクタを終了するコードになります。

これでデータベースを扱う準備ができたので、つづいて、4つのHTTPメソッドに関するコードを書いていきます。

デコレーター

今回は、POST、PUT、DELETEについては、/employeeでアクセスして、GETは/employee/<name>でアクセスするようにしています。

@app.route('/employee', methods=['POST', 'PUT', 'DELETE'])
@app.route('/employee/', methods=['GET'])

続いてデータベースにテーブルを作成するコードとそれぞれのメソッドの処理をするコードを書いていきます。

データベースの処理

データベースの処理を行う関数を作成します。

def employee(name=None):
    db = get_db()
    curs = db.cursor()
    curs.execute(
        'CREATE TABLE IF NOT EXISTS persons( '
        'id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING)'
    )
    db.commit()

    name = request.values.get('name', name)
    if request.method == 'GET':
        curs.execute('SELECT * FROM persons WHERE name = "{}"'.format(name))
        person = curs.fetchone()
        if not person:
            return "No", 404
        user_id, name = person
        return '{}:{}'.format(user_id, name), 200

    if request.method == 'POST':
        curs.execute('INSERT INTO persons(name) values("{}")'.format(name))
        db.commit()
        return 'created {}'.format(name), 201

    if request.method == 'PUT':
        new_name = request.values['new_name']
        curs.execute('UPDATE persons set name = "{}" WHERE name = "{}"'.format(new_name, name))
        db.commit()
        return 'update {}: {}'.format(name, new_name), 200

    if request.method == 'DELETE':
        curs.execute('DELETE from persons WHERE name = "{}"'.format(name))
        db.commit()
        return 'deleted {}'.format(name), 200

    curs.close()

順番にコードを解説していきます。

26行目27行目でデータベースのコネクタとカーソルを作成しています。

28行目から32行目で、テーブルが存在しない場合、自動入力のidと文字列のnameがあるpersonsテーブルを作成し、保存します。

34行目では、クライアントからリクエストを受け取ったnameを変数nameに代入しています。

35行目から41行目は、GETメソッドのときの処理コードになります。
GETメソッドで受け取ったnamepersonsテーブルに存在しなければ、NoとHTTPのステータスコードのなにもないという意味の404を返します。

受け取ったnameがテーブルに存在する場合は、idname、成功のHTTPステータスコードである200を返します。

43行目から46行目では、POSTメソッドで受け取ったnameを新しくpersonsテーブルに追加して、メッセージと新規作成が成功したHTTPステータスコードの201を返しています。

48行目から52行目は、PUTメソッドで、値の更新なので、更新したあとの名前new_nameと更新する前の名前nemeを受け取って値を更新したあと、メッセージと成功の202を返します。

54行目空57行目はDELETEメソッドで、受け取ったnamepersonsテーブルから削除し、メッセージと成功の200を返しています。

最後にカーソルを閉じて関数部分は完了です。

main関数で実行

コードの最後は、main()関数として実行するコードを追加します。

def main():
    app.debug = True
    app.run()

if __name__ == '__main__':
    main()

このPythonファイルを実行するとサーバーが起動して、リクエストを待っている状態になります。

ブラウザーからアクセス

サーバーが立ち上がっている状態でブラウザーから127.0.0.1:5000/employee/masteruにアクセスすると、画面にはNoと表示されます。

Flask データベース

GETリクエストを受けたので、作業ディレクトリにtest_sqlite.dbが新しく作成されています。

Flask データベース

続いて、HTTPメソッドを要求するクライアントのPythonファイルを作成します。

test_flask.py

名前は昨日同様に、test_flask.pyにして、中身を変更してみます。

import requests


r = requests.get('http://127.0.0.1:5000/employee/masteru')
print(r.text)

r = requests.post('http://127.0.0.1:5000/employee', data={'name': 'masteru'})
print(r.text)

r = requests.put('http://127.0.0.1:5000/employee', data={'name': 'masteru', 'new_name': 'mark'})
print(r.text)

r = requests.delete('http://127.0.0.1:5000/employee', data={'name': 'mark'})
print(r.text)

4つのHTTPメソッドをrequestsして返ってきた値を出力しています。

4行目のGETメソッドでは、アドレスの最後に<name>であるmasteruを入れています。

7行目はPOSTメソッドで、nameに、masteruを指定しています。

10行目のPUTメソッドでは、masterumarkに更新しています。

13行目は、markを削除するリクエストを送っています。

出力結果は次のようになっています。

Flask データベース

実際に使ってみる必要あり

コードを写経的に書いていきましたが、過去に学習したSQLiteについては、内容が理解できるのですが、他のコードについては、3回ほど繰り返して書いてみてなんとなく役割がわかったようなわからないような感じでした。

具体的な使い方がわからないと、ある意味ペーパードライバーと変わらないので、速く実践で使ってみたい欲求が出てきています。

ただ、今はPythonの全体像を掴むために広く浅く学習中なので、すべてのレクチャーが終了してから、重点的に必要なところを再学習する予定です。

それでは、今日はこのへんで。

明日も元気にGood Python!