1. 説明
このシリーズは3~4回に分けて記事にする予定です。このシリーズが終わるまでに、Flask を使用して RESTful API を構築することがいかに簡単であるかがわかるでしょう。この記事では、環境を設定し、「Hello World」を表示するエンドポイントを作成します。
コンピューターに Python 2.7 と pip がインストールされていると仮定します。この記事で紹介されているコードは Python 2.7 でテストしましたが、Python 3.4 以降でも問題ない可能性があります。
2、フラスコをインストールします
a.フラスコの取り付け
Flask は Python 用のマイクロフレームワークです。マイクロフレームワークの「マイクロ」は、Flask がコアをシンプルだが拡張可能に保つことを目指していることを意味します ( http://flask.pocoo.org/docs/0.12/foreword/#what-does-micro-mean )。次のコマンドを使用して flask をインストールできます。
$ pip install Flask
b. IDE を準備する
実際には、あらゆる種類のテキスト エディターを使用して Python アプリケーションを構築できますが、IDE を使用するとはるかに簡単になります。個人的には、jetbrains の Pycharm を使用することを好みます ( PyCharm: the Python IDE for Professional Developers by JetBrains )。
c. フラスコに「hello world」を作成します
まず、プロジェクト フォルダーを作成する必要があります。このチュートリアルでは、「flask_tutorial」という名前を付けました。pycharm を使用している場合は、メニューから [ファイル] および [新しいプロジェクト] を選択してプロジェクト フォルダーを作成できます。
その後、プロジェクトの場所とインタープリターを設定できます。とにかく、あなたのコンピュータには Python インタープリタが搭載されています。
プロジェクトを設定したら、pycharm 上のプロジェクト フォルダーを右クリックし、[新規] -> [Python ファイル] を選択して、「app.py」という名前を付けます。
app.pyに以下のコードを書きます。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == '__main__':
app.run(debug=True)
ターミナルから実行します。コマンドラインを使用するか、pycharm から左下隅にあるターミナル タブをクリックして、以下のコードを記述します。
$ Python app.py
ブラウザを開いて、localhost:5000 にアクセスします。ほら、これで最初の flask アプリが完成しました :)
さて、コードを見てみましょう。
from flask import Flask
この行では、アプリケーションが flask パッケージから flask モジュールをインポートする必要があります。Web アプリケーション インスタンスを作成するための Flask。
app = Flask(__name__)
この行は、Web アプリケーションのインスタンスを作成します。__name__ は Python の特殊変数で、モジュール (Python ファイル) がメイン プログラムとして実行される場合、「__main__」と等しくなります。
@app.route("/")
この行はルートを定義します。たとえば、上記のようにルートを「/」に設定した場合、localhost:5000/にアクセスするとコードが実行されます。ルートを「/hello」に設定すると、localhost:5000/hello にアクセスすると、「hello world」が表示されます。
def hello():
return "Hello World!"
この行は、ルートにアクセスした場合に実行される関数を定義します。
if __name__ == '__main__':
app.run(debug=True)
この行は、app.py から実行すると flask アプリが実行されることを示しています。また、パラメータを に設定していることにも注意してください。これにより、可能性のある Python エラーが Web ページに出力され、エラーの追跡に役立ちます。debug
true
パート 1 はこれですべてです。次に、flask を使用して SQLLite で CRUD 操作を実行してみます。
3. flask と SQLite を使用してシンプルな RESTful API を構築する
この記事では、flask と SQLite を使用して、データベースのデータを作成、読み取り、更新、削除する関数を備えたシンプルな RESTful API を構築する方法を説明します。
3.1 flask-sqlalchemy と flask-marshmallow のインストール
SQLAlchemy は、開発者に SQL のフルパワーと柔軟性を提供する Python SQL ツールキットおよび ORM です。ここで、 flask-sqlalchemy は、SQLAlchemy のサポートを flask アプリケーションに追加する flask 拡張機能です ( Flask-SQLAlchemy — Flask-SQLAlchemy Documentation (2.x) )。
一方、flask-marshmallow は、Flask と Marshmallow (オブジェクトのシリアル化/逆シリアル化ライブラリ) を統合するための Flask 拡張機能です。この記事では、flask-marshmallow を使用して JSON 応答をレンダリングします。
次のコマンドを使用すると、pip を使用して flask-sqlalchemy と flask-marshmallow を簡単にインストールできます。
$ pip install flask_sqlalchemy
$ pip install flask_marshmallow
$ pip install marshmallow-sqlalchemy
3.2. コードの準備
crud.py という名前のフォルダーに新しい flask_tutorial Python ファイルを作成します。crud.pyに次のコードを書き留めます。
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
import os
app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'crud.sqlite')
db = SQLAlchemy(app)
ma = Marshmallow(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __init__(self, username, email):
self.username = username
self.email = email
class UserSchema(ma.Schema):
class Meta:
# Fields to expose
fields = ('username', 'email')
user_schema = UserSchema()
users_schema = UserSchema(many=True)
# endpoint to create new user
@app.route("/user", methods=["POST"])
def add_user():
username = request.json['username']
email = request.json['email']
new_user = User(username, email)
db.session.add(new_user)
db.session.commit()
return jsonify(new_user)
# endpoint to show all users
@app.route("/user", methods=["GET"])
def get_user():
all_users = User.query.all()
result = users_schema.dump(all_users)
return jsonify(result.data)
# endpoint to get user detail by id
@app.route("/user/<id>", methods=["GET"])
def user_detail(id):
user = User.query.get(id)
return user_schema.jsonify(user)
# endpoint to update user
@app.route("/user/<id>", methods=["PUT"])
def user_update(id):
user = User.query.get(id)
username = request.json['username']
email = request.json['email']
user.email = email
user.username = username
db.session.commit()
return user_schema.jsonify(user)
# endpoint to delete user
@app.route("/user/<id>", methods=["DELETE"])
def user_delete(id):
user = User.query.get(id)
db.session.delete(user)
db.session.commit()
return user_schema.jsonify(user)
if __name__ == '__main__':
app.run(debug=True)
ショートコードの場合、上記のコードには、新しいレコードの作成、データベースからのすべてのレコードの取得、ID によるレコードの詳細の取得、選択したレコードの更新、および選択したレコードの削除を行う機能を備えた 5 つのエンドポイントがあります。また、このコードでは、データベースのモデルを定義します。
コードを部分ごとに見てみましょう
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
import os
この部分では、アプリケーションに必要なすべてのモジュールをインポートします。Web アプリケーションのインスタンスを作成するために Flask をインポートし、リクエスト データを取得するために request をインポートし、JSON 出力を application /json mimetype を持つオブジェクトに変換するために jsonify をインポートし、データベースにアクセスするために flask_sqlalchemy を SQAlchemy にインポートし、オブジェクトをシリアル化するために flask_marshmallow を Marshmallow にインポートします 。Response
app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'crud.sqlite')
この部分では、Web アプリケーションのインスタンスを作成し、SQLite URI へのパスを設定します。
db = SQLAlchemy(app)
ma = Marshmallow(app)
このパートでは、SQLAlchemy と Marshmallow を Flask アプリケーションにバインドします。
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __init__(self, username, email):
self.username = username
self.email = email
SQLAlchemy をインポートして Flask アプリケーションにバインドした後、モデルを宣言できます。ここでは、User というモデルを宣言し、そのプロパティを使用してそのフィールドを定義します。
class UserSchema(ma.Schema):
class Meta:
# Fields to expose
fields = ('username', 'email')
user_schema = UserSchema()
users_schema = UserSchema(many=True)
このセクションでは、エンドポイントの応答構造を定義します。すべてのエンドポイントに JSON 応答が必要です。ここでは、JSON 応答に 2 つのキー (ユーザー名と電子メール) が含まれることを定義します。さらに、user_schema を UserSchema のインスタンスとして定義し、user_schemas を UserSchema インスタンスのリストとして定義します。
# endpoint to create new user
@app.route("/user", methods=["POST"])
def add_user():
username = request.json['username']
email = request.json['email']
new_user = User(username, email)
db.session.add(new_user)
db.session.commit()
return jsonify(new_user)
この部分では、新しいユーザーを作成するためのエンドポイントを定義します。まず、ルートを「/user」に、HTTP メソッドを POST に設定します。ルートとメソッドを設定した後、このエンドポイントにアクセスしたときに実行される関数を定義します。この関数では、まずリクエスト データからユーザー名と電子メールを取得します。その後、リクエストデータのデータを使用して新しいユーザーを作成します。最後に、新しいユーザーをデータベースに追加し、応答として新しいユーザーを JSON で表示します。
# endpoint to show all users
@app.route("/user", methods=["GET"])
def get_user():
all_users = User.query.all()
result = users_schema.dump(all_users)
return jsonify(result.data)
この部分では、すべてのユーザーのリストを取得し、結果を JSON 応答として表示するエンドポイントを定義します。
# endpoint to get user detail by id
@app.route("/user/<id>", methods=["GET"])
def user_detail(id):
user = User.query.get(id)
return user_schema.jsonify(user)
このパートの前の部分と同様に、ユーザー データを取得するエンドポイントを定義しましたが、ここではすべてのユーザーを取得するのではなく、ID によって 1 人のユーザーからデータを取得するだけです。ルートをよく見ると、このエンドポイントのルートにさまざまなパターンがあることがわかります。「<id> 」のような親はパラメータなので、必要に応じて変更できます。このパラメータは、関数内でこのパラメータ値を取得できるように、関数パラメータ (この場合は def user_detail(id) ) に配置する必要があります。
# endpoint to update user
@app.route("/user/<id>", methods=["PUT"])
def user_update(id):
user = User.query.get(id)
username = request.json['username']
email = request.json['email']
user.email = email
user.username = username
db.session.commit()
return user_schema.jsonify(user)
このパートでは、ユーザーを更新するためのエンドポイントを定義します。まず、パラメータで指定された ID に関連付けられたユーザーを呼び出します。次に、このユーザーのユーザー名と電子メールの値をリクエスト データの値で更新します。
# endpoint to delete user
@app.route("/user/<id>", methods=["DELETE"])
def user_delete(id):
user = User.query.get(id)
db.session.delete(user)
db.session.commit()
return user_schema.jsonify(user)
最後に、ユーザーを削除するエンドポイントを定義します。まず、パラメータで指定された ID に関連付けられたユーザーを呼び出します。それからそれを削除します。
4. SQLiteデータベースの生成
前の手順で、SQLite の CRUD 操作を処理するコードを作成しましたが、この Python ファイルを実行してエンドポイントにアクセスしようとすると (localhost:5000/user にアクセスしようとすると)、次のようなエラーが発生します。以下の情報
操作エラー: (sqlite3.操作エラー) そのようなテーブルはありません: ユーザー [SQL: u'SELECT user.id AS user_id, user.username AS user_username, user.email AS user_email \nFROM user']
このエラー メッセージが表示される理由は、SQLite からデータを取得しようとしているが、SQLite データベースがまだないことです。したがって、このステップでは、アプリケーションを実行する前に SQLite データベースを生成します。次の手順を使用して、crud.py のモデルに基づいて SQLite データベースを生成できます。
- Python 対話型シェルに入る
まず、ターミナルで次のコマンドを使用して Python 対話型シェルに入る必要があります。
$ パイソン
2. データベース オブジェクトをインポートし、SQLite データベースを生成する
Python インタラクティブ シェルで次のコードを使用します。
粗製
>>> db.create_all() >>>からデータベースをインポートします
crud.sqlite は flask_tutorial フォルダーに生成されます。
5.フラスコアプリケーションを実行します
sqlite データベースを生成した後、flask アプリケーションを実行できます。ターミナルから次のコマンドを実行してアプリケーションを実行します。
$ python crud.py
フラスコ アプリケーションを試す準備ができました。フラスコ アプリケーションでエンドポイントを試すには、curl や postman などの API 開発ツールを使用できます。個人的にはAPI 開発にはPostman ( Postman ) が好きです。この記事では、postman を使用してエンドポイントにアクセスします。
- 新しいユーザーを作成する
2. すべてのユーザーを取得する
3. ID でユーザーを取得する
4. ユーザーを更新する
5. ユーザーの削除
6. 追記
この記事は以上です。次に、pytest を使用して小さなテストを作成する予定です。