この記事では、CRUDについて学んだ後、Flask CRUDアプリケーションを作成します。
CRUDアプリケーションとは?
Webアプリケーションのうち、Create/Retrieve/Update/Deleteの操作を行うものをCRUDアプリケーションと呼びます。
CRUDアプリケーションの典型的な例として、ブログサイトがあります。
ここでは
- Blogを新規に作成することができます。作成
- 投稿されたブログを見ることができます。取得する
- ブログを更新する 更新する
- ブログを削除します。削除
CRUDの定義をまとめると、以下のようになります。
| オペレーション|ファンクション
| — | — |
| 作成:新しいデータを作成し、データベースに追加します。
| Retrieve|データベースからデータを取得します。
| 更新(Update): 既存のデータをデータベースに更新します。
| Delete(削除): 既存のデータをデータベースから削除します。
pip install flask_sqlalchemy
|
FlaskのCRUDアプリケーションを作成する
社員情報の作成/取得/更新/削除ができるシンプルなFlaskのCRUDアプリケーションを作成します。
したがって、このアプリケーションでは、次のことができます。
- 新しい従業員情報を作成する
- 従業員のリストを見る。
-
- 特定の従業員の情報を見る
- 従業員の情報を更新する
- 社員情報の削除
1. Models.py のコーディング
ここでは、Flask_SQLAlchemyとSQLite DBを使用します。
まず、Flask_SQAlchemyをインストールします。
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class EmployeeModel(db.Model):
__tablename__ = "table"
id = db.Column(db.Integer, primary_key=True)
employee_id = db.Column(db.Integer(),unique = True)
name = db.Column(db.String())
age = db.Column(db.Integer())
position = db.Column(db.String(80))
def __init__(self, employee_id,name,age,position):
self.employee_id = employee_id
self.name = name
self.age = age
self.position = position
def __repr__(self):
return f"{self.name}:{self.employee_id}"
|
models.pyを作成し、以下のコードを追加します。
from flask import Flask
app = Flask(__name__)
app.run(host='localhost', port=5000)
|
ここではEmployeeModelを作成しています。
もし構文が理解できない場合は、SQLAlchemyのチュートリアルを参照してください。
2. メインアプリケーションのコーディング
では、メインの Flask Application File をコーディングしてみましょう。
まず、Flask をインポートし、flask app を初期化し、アプリケーションのランタイムの詳細を設定するところから始めます。
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///<db_name>.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.run(host='localhost', port=5000)
|
次に、SQLite DB と SQLAlchemy を連携させます。
そこで、以下のコードスニペットを追加します。
from flask import Flask
app =Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///<db_name>.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)@app.before_first_request
def create_table():
db.create_all()
app.run(host='localhost', port=5000)
|
は、DB File の名前に置き換えてください。
また、ユーザーがサーバーにアクセスする前に、(models.py から)DB インスタンスをリンクして、DB ファイルを作成する必要があります。
@app.route('/data/create' , methods = ['GET','POST'])
def create():
if request.method == 'GET':
return render_template('createpage.html')
if request.method == 'POST':
employee_id = request.form['employee_id']
name = request.form['name']
age = request.form['age']
position = request.form['position']
employee = EmployeeModel(employee_id=employee_id, name=name, age=age, position = position)
db.session.add(employee)
db.session.commit()
return redirect('/data')
|
さて、DBとモデルの準備ができたので、CRUDビューをコーディングしましょう。
この記事もチェック:Flaskのライブラリflask-wtfの使い方|簡単にフォームを作成するよ
3. 作成ビューのコーディング
Create ビューは、以下の機能を備えている必要があります。
- クライアントがこのページにアクセスすると(GET メソッド)、クライアントのデータを取得するためのフォームが表示されます。
- 送信時(POST メソッド)には、クライアントのデータを EmployeeModel データベースに保存する必要があります。
というわけで、Create View は以下のようになります。
<form action='' method = "POST">
<p>employee ID <input type = "integer" name = "employee_id" /></p>
<p>name <input type = "text" name = "name" /></p>
<p>age <input type = "integer" name = "age" /></p>
<p>position <input type = "text" name = "position" /></p>
<p><input type = "submit" value = "Submit" /></p>
</form>
|
createpage.html には、HTML Form が含まれます。
@app.route('/data')
def RetrieveDataList():
employees = EmployeeModel.query.all()
return render_template('datalist.html',employees = employees)
|
4. 取得ビューのコーディング
ここでは、2つのビューを用意します。
- 従業員のリストを表示します。
- 従業員のリストを表示します。 * 単一の従業員の情報を表示します。
最初のRetrieveDataListビューは次のようになります。
{% for employee in employees %}
<h3>{{employee}}</h3><hr>
{% endfor %}
|
datalist.html ファイルは、従業員のリストを表示します。
@app.route('/data/<int:id>')
def RetrieveSingleEmployee(id):
employee = EmployeeModel.query.filter_by(employee_id=id).first()
if employee:
return render_template('data.html', employee = employee)
return f"Employee with id ={id} Doenst exist"
|
テンプレート言語については、Flask Templateを参照してください。
そして、2つ目のRetrieveSingleEmployeeビューは以下のようになります。
<h3>Id</h3>
<p>{{employee.employee_id}}</p><hr>
<h3>Name</h3>
<p>{{employee.name}}</p><hr>
<h3>Age</h3>
<p>{{employee.age}}</p><hr>
<h3>Position</h3>
<p>{{employee.position}}</p><hr>
|
EmployeeModel.query.filter_by(employee_id = id).first() は、DB 内の Employee ID = id を持つ最初の Employee を返し、その ID を持つ Employee が存在しない場合は None を返します。
Data.html には、Employee の情報が表示されます。
@app.route('/data/<int:id>/update',methods = ['GET','POST'])
def update(id):
employee = EmployeeModel.query.filter_by(employee_id=id).first()
if request.method == 'POST':
if employee:
db.session.delete(employee)
db.session.commit()
name = request.form['name']
age = request.form['age']
position = request.form['position']
employee = EmployeeModel(employee_id=id, name=name, age=age, position = position)
db.session.add(employee)
db.session.commit()
return redirect(f'/data/{id}')
return f"Employee with id = {id} Does nit exist"
return render_template('update.html', employee = employee)
|
5. 更新ビューのコード化
Update View は、DB 内の Employee 詳細情報を、ユーザが送信した新しい情報に更新します。
したがって、Update View は次のようになります。
<form action='' method = "POST">
<p>name <input type = "text" name = "name" value="{{employee.name}}"/></p>
<p>age <input type = "integer" name = "age" value="{{employee.age}}"/></p>
<p>position <input type = "text" name = "position" value="{{employee.position}}"/></p>
<p><input type = "submit" value = "Submit" /></p>
</form>
|
ユーザはフォームから新しい情報を送信します。
ここでは、まず DB 内の古い情報を削除し、新しい情報を追加します。
update.htmlには、新しい情報を送信するためのフォームが表示されます。
@app.route('/data/<int:id>/delete', methods=['GET','POST'])
def delete(id):
employee = EmployeeModel.query.filter_by(employee_id=id).first()
if request.method == 'POST':
if employee:
db.session.delete(employee)
db.session.commit()
return redirect('/data')
abort(404)
return render_template('delete.html')
|
6. Delete View のコード化
Delete View は、DB File から Employee 情報を削除するだけです。
Delete View は次のようになります。
<form action='' method="post">
Click YES to confirm
<input type = "submit" value="YES">
<a href='/data'>Cancel</a>
</form>
|
delete.html は、削除の再確認を行うだけです。
from flask_sqlalchemy import SQLAlchemy
db =SQLAlchemy()
class EmployeeModel(db.Model):
__tablename__ = "table"
id = db.Column(db.Integer, primary_key=True)
employee_id = db.Column(db.Integer(),unique = True)
name = db.Column(db.String())
age = db.Column(db.Integer())
position = db.Column(db.String(80))
def __init__(self, employee_id,name,age,position):
self.employee_id = employee_id
self.name = name
self.age = age
self.position = position
def __repr__(self):
return f"{self.name}:{self.employee_id}"
|
ユーザがYesを押せば、その社員は削除されます。
そうでなければ、元に戻されます。
CRUDアプリケーションのフルコード
models.py。
from flask import Flask,render_template,request,redirect
from models import db,EmployeeModel
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)@app.before_first_request
def create_table():
db.create_all()
@app.route('/data/create' , methods = ['GET','POST'])
def create():
if request.method == 'GET':
return render_template('createpage.html')
if request.method == 'POST':
employee_id = request.form['employee_id']
name = request.form['name']
age = request.form['age']
position = request.form['position']
employee = EmployeeModel(employee_id=employee_id, name=name, age=age, position = position)
db.session.add(employee)
db.session.commit()
return redirect('/data')
@app.route('/data')
def RetrieveList():
employees = EmployeeModel.query.all()
return render_template('datalist.html',employees = employees)
@app.route('/data/<int:id>')
def RetrieveEmployee(id):
employee = EmployeeModel.query.filter_by(employee_id=id).first()
if employee:
return render_template('data.html', employee = employee)
return f"Employee with id ={id} Doenst exist"
@app.route('/data/<int:id>/update',methods = ['GET','POST'])
def update(id):
employee = EmployeeModel.query.filter_by(employee_id=id).first()
if request.method == 'POST':
if employee:
db.session.delete(employee)
db.session.commit()
name = request.form['name']
age = request.form['age']
position = request.form['position']
employee = EmployeeModel(employee_id=id, name=name, age=age, position = position)
db.session.add(employee)
db.session.commit()
return redirect(f'/data/{id}')
return f"Employee with id = {id} Does nit exist"
return render_template('update.html', employee = employee)
@app.route('/data/<int:id>/delete', methods=['GET','POST'])
def delete(id):
employee = EmployeeModel.query.filter_by(employee_id=id).first()
if request.method == 'POST':
if employee:
db.session.delete(employee)
db.session.commit()
return redirect('/data')
abort(404)
return render_template('delete.html')
app.run(host='localhost', port=5000)
|
メインのFLASKアプリケーションです。

Flask CRUDアプリケーションの実装
サーバーを起動し、”/data/create “に移動します。

ここで詳細を入力し、Submitを押します。
同様に、いくつか追加しています。
“/data “にアクセスします。

1つ目のデータを確認します。
“/data/1 “にアクセスします。

次に、”/data/1/update “に移動して、いくつかの内容を更新します。

詳細が更新されました。
次に、この従業員を削除します。
“/data/1/delete “に移動してください。

はい]を押して、完了です。
この社員は削除されました。
この記事もチェック:Flaskでフォームを実装|ユーザーの入力を受け取る方法などを解説
まとめ
以上です。
以上、Flask の CRUD 操作についてでした。
Flask REST API チュートリアルの Flask REST Framework での CRUD アプリケーションをチェックしてみてください。
では、また次の記事でお会いしましょう