この記事はなに?
最近Falconを触ってみたところ、かなり使い勝手が良さそうがな感じでした。
ちょうど作ろうとしていたWebアプリのAPIサーバをこれで作りたい気分になったので、まずは簡単なAPIサーバから作ってみようと思っていたところ、
すでにBoilerPlateを作られている方がいました。
この記事はそのBoilerPlateを試してみた時の作業ログです。
使用するBoilerPlate
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リポジトリを確認したところ、同じタイプのissueがあがっており、pull requestも出されていますが、このプロジェクトの開発自体が停止してしまっているようでした。
というか、BoilerPlateの作者と同じ方が開発されているようですね。
プルリクを出していた方がpython3に対応したものをforkしていたので、そちらを使うようにします。
https://github.com/Tethik/falcon-jsonifygithub.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/