Python学習【365日チャレンジ!】168日目のマスターU(@Udemy11)です。
先日購入した【アースサラテクトミストリッチリッチ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メソッドで受け取ったname
がpersons
テーブルに存在しなければ、No
とHTTPのステータスコードのなにもないという意味の404
を返します。
受け取ったname
がテーブルに存在する場合は、id
とname
、成功のHTTPステータスコードである200
を返します。
43行目から46行目では、POSTメソッドで受け取ったname
を新しくpersons
テーブルに追加して、メッセージと新規作成が成功したHTTPステータスコードの201
を返しています。
48行目から52行目は、PUTメソッドで、値の更新なので、更新したあとの名前new_name
と更新する前の名前neme
を受け取って値を更新したあと、メッセージと成功の202
を返します。
54行目空57行目はDELETEメソッドで、受け取ったname
をpersons
テーブルから削除し、メッセージと成功の200
を返しています。
最後にカーソルを閉じて関数部分は完了です。
main関数で実行
コードの最後は、main()
関数として実行するコードを追加します。
def main():
app.debug = True
app.run()
if __name__ == '__main__':
main()
このPythonファイルを実行するとサーバーが起動して、リクエストを待っている状態になります。
ブラウザーからアクセス
サーバーが立ち上がっている状態でブラウザーから127.0.0.1:5000/employee/masteru
にアクセスすると、画面にはNo
と表示されます。
GETリクエストを受けたので、作業ディレクトリにtest_sqlite.db
が新しく作成されています。
続いて、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メソッドでは、masteru
をmark
に更新しています。
13行目は、mark
を削除するリクエストを送っています。
出力結果は次のようになっています。
実際に使ってみる必要あり
コードを写経的に書いていきましたが、過去に学習したSQLiteについては、内容が理解できるのですが、他のコードについては、3回ほど繰り返して書いてみてなんとなく役割がわかったようなわからないような感じでした。
具体的な使い方がわからないと、ある意味ペーパードライバーと変わらないので、速く実践で使ってみたい欲求が出てきています。
ただ、今はPythonの全体像を掴むために広く浅く学習中なので、すべてのレクチャーが終了してから、重点的に必要なところを再学習する予定です。
それでは、今日はこのへんで。
明日も元気にGood Python!