at backyard

Color my life with the chaos of trouble.

REST API with Falcon, MongoDBのBoilerPlateを試す。

この記事はなに?

最近Falconを触ってみたところ、かなり使い勝手が良さそうがな感じでした。
ちょうど作ろうとしていたWebアプリのAPIサーバをこれで作りたい気分になったので、まずは簡単なAPIサーバから作ってみようと思っていたところ、 すでにBoilerPlateを作られている方がいました。
この記事はそのBoilerPlateを試してみた時の作業ログです。

使用するBoilerPlate

githubリポジトリは下記のものを使用します。

github.com

Project template for REST API with Falcon, MongoDB and PyPy

PyPyを使用するようですが、今回私はPyPyは使わず、Python3環境で動かすことにしました。

作業ログ

# プロジェクトをクローン
git clone https://github.com/AndreiRegiani/falcon-mongo-template.git
cd falcon-mongo-template


# 仮想環境"env"を作成する。
virtualenv env

# 仮想環境有効化
source env/bin/activate

# pipインストール
pip install -r requirements.txt

# サーバ起動
./run_server.sh

MongoDBも動作させます、 なお、すでにMongoDBはインストール済みとします。

# 別のターミナル上で、認証なしで起動させます
mongod --config /usr/local/etc/mongod.conf

curlを使って、データを登録させます。
ちなみにここでemailに"value"というデータを登録させようとしていますが、BoilerPlate内部の実装では固定値でdbに登録するような実装に現在なっているため、postする値に関係なくdbにはハードコーディングされているデータが登録されるはずです。

# 適当にjson使ってポストさせる
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"email": "value"}'  http://localhost:8000/api/example

ここでサーバ側のログに下記のようにエラーが出てきました。(ログの内容は削っています)

env/lib/python3.6/site-packages/falcon_jsonify/__init__.py", line 36, in get_json
    if dtype == str and type(value) == unicode:
NameError: name 'unicode' is not defined

falcon_jsonifyでのエラーのようです。
unicodeということはpython3で実行したゆえのものでしょうか?
BoilerPlateのリポジトリ自体がpypy(おそらく2系)かpython2.7で使用することを想定しているためかもしれません。

falcon-jsonify

BoilerPlate内部で使用されているこちらのライブラリでエラーが発生しているようです。

falcon-jsonify

github.com

githubリポジトリを確認したところ、同じタイプのissueがあがっており、pull requestも出されていますが、このプロジェクトの開発自体が停止してしまっているようでした。
というか、BoilerPlateの作者と同じ方が開発されているようですね。

github.com

プルリクを出していた方がpython3に対応したものをforkしていたので、そちらを使うようにします。

github.com

# 一旦uninstallします
pip uninstall falcon-jsonify

# 代わりにforkされていたプロジェクトをインストール
pip install git+https://github.com/Tethik/falcon-jsonify

それでは、先ほどと同じように./run_server.shでサーバを立ててcurlでpostしてみます。

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"email": "value"}'  http://localhost:8000/api/example

すると今回はエラーにならず、処理に成功したようです。 mongo shellを立ち上げて、データが生成されているかを確認し、database-1というdbが作成されており、 その中のexample_modelというコレクション内にデータが1件追加されていることを確認しました。 これで成功です。

BoilerPlateを動かす際の対応策

対応策としてはrequirements.txtを下記のように変更し、上に書いた手順を実行することでPython3で動きます。

falcon-jsonify==0.1.1
↓
git+https://github.com/Tethik/falcon-jsonify

 最後に仮想環境の片付け

# 仮想環境無効化
(env) $ deactivate

# 仮想環境の削除
$ rm -rf env/