Falconを使ってみた2
Falconをローカル環境で動かせたので、今度はクラウドにアップしてみます。
AWSやGAE、Heroku等色々選択肢がありますが、検証も兼ねてCloud9を使ってみました。
Cloud9
Cloud9は開発環境+外部レポジトリとの連携、他のクラウドへのデプロイができるサービスなので、すぐに開発を始めたい場合などに利用できます。
今回はbitbucketと連携して使用してみます。
1.bitbucket & Cloud9へ登録
・bitbucket
Git and Mercurial code management for teams
・Cloud9
Cloud9 - Your development environment, in the cloud
bitbucketでレポジトリを作成して、前回作成したソースを追加(手順は省略)
Cloud9側はbitbucketのアカウントでログインすると良いです。
2.bitbucketとの連携
・Dashboadの[ACCOUNT SETTINGS]-[Show your SSH key]をコピーし、bitbucket側でアカウントの管理からSSHキーを追加します。
・ADD-ON SERVICESの[Bitbucket]をactivateにしておきます。
3.Workspaceの作成
[Create New Workspace]の[Clone From URL]を選択し、SourceURLに「git@bitbucket.org:レポジトリ名.git」を入力、Wokspaceのタイプは[custom]で[Create]ボタンをクリックします。
※SourceURLに入力するのはgit cloneする時に使用するURLです。
レポジトリのクローンが開始されるので[START EDITING]が表示されるまで待ちます。
4.アプリケーションの起動
[START EDITING]ボタンをクリックするとCloud9のIDEが立ち上がるので、
画面下部のTerminalにて作業を行います。
まずは必要なモジュールをインストールします。
$ sudo pip install --upgrade cython falcon gunicorn
今回は無償のプランなのでメモリなどが少なく警告が出る場合があります。
あとは通常通り起動します。
$ gunicorn hello:app
起動後にログにURLが表示されるので、それをクリックするとIDE内にブラウザが立ち上がります。
URLの所に「https://workspace名-ユーザー名.c9.io/」が入っているので/helloを付与すると確認ができます。
また、右上部の四角いボタンをクリックすると通常のブラウザページとしても表示されます。
※たまにうまくURLが入らないことがあるようですが、原因はわからないままでした。
何回かやっていると入るかも?
あとは、Cloud9上でソースを修正してpushしたり、逆にbitbucketに対して編集されたものをpullすることができます。
クラウド上に環境が集約されているのでとても便利ですね!
Falconを使ってみた
昨日はWindows版の環境構築が失敗したので、今日はOS Xにて環境構築を行いました。
$ pip install --upgrade cython falcon
はい、特に問題もなくインストールが出来ましたw
ついでにgunicornも入れておきます。
$ pip install gunicorn
以下のような内容のhello.pyを作成します。
import falcon # Hello Worldを返すリソースクラス。 # REST APIとして、リソースを用意して登録する形で作成します。 class HelloResource: def on_get(self, req, resp): resp.status = falcon.HTTP_200 resp.body = ('Hello World!') app = falcon.API() hello = HelloResource() # falconのインスタンスにリソースを追加 app.add_route('/hello', hello)
以下のコードで起動します。
gunicorn hello:app
以下のコマンドでAPIから結果が取得できるか確認してみます。
curl localhost:8000/hello
「Hello World!」と表示されれば成功です!
bottleのように簡単にAPIが作れるのは良いですね。
Webアプリケーションを作る時はbottle、WebAPIを作る時はfalconと住み分けも出来そう。
Falconを使ってみ(ようとし)た
今年に入ってから参加している勉強会で、WebAPIを作ろうということになったのでFalconを使ってみることにしました。
Falcon
Falcon - The minimalist Python WSGI framework
Falconは高速で動く小型のWSGIフレームワークで、BottleやFlaskよりも早いみたいです。
何より名前がカッコいいですね!
今回はWindows8、Python3.4+virtualenvの環境にインストールしてみます。
公式ページを見るといくつか方法があるのでpipでインストール!
$ pip install --upgrade cython falcon
おっと、何やら赤い文字が・・・
ログを見るとC++のコンパイラが必要なようです。(cythonだから当たり前かw)
error: Microsoft Visual C++ 10.0 is required (Unable to find vcvarsall.bat).
そういえばVisualStudioをインストールしていなかったので、この際だから
無償版をインストールしてしまおう!
Free Dev Tools - Visual Studio Community 2013
・・・
はい、結論から言うと駄目でしたw
相変わらずvcvarsall.batが見つからないというので、このバッチファイルがあるディレクトリを環境変数に追加してみても反応なし。
色々と調べてみると、どうもpython3.4をコンパイルしたVisual C++ 2010を入れないと駄目な模様。
うーむ、最新版のPythonが古いVSに依存しているとは残念すぎる。。
解決策としては
・MinGWを使う
・VSの古いバージョンを入れる(それでも動かない場合があるらしい)
ですが、簡単にvirtualenvに環境を作ることが出来なさそうなので、Windowsは諦めてOS Xに入れることにします。。
nginxとgunicornの設定
nginx+gunicorn環境において、
以下の様なエラーが発生した場合、設定ファイルの調整で解決できます。
・リクエストのBodyサイズが大きい:「413 “Request Entity Too Large” error with uploading a file」
・レスポンスが遅い:「upstream prematurely closed connection while reading response header from upstream」
・リクエストの最大Bodyサイズの設定
nginx.confのhttpセクションに以下の様な設定を追加する。
client_max_body_size 2M;
ファイルアップロード時などにぶつかる問題ですね。ファイルを圧縮するなど工夫することも考えたほうが良いかもしれません。
・レスポンスの待ち時間の設定
gunicorn.conf.pyの以下の値を増やす。
timeout 15
本来は遅くならない対策を取るべきですが、レスポンスが遅くても差し支えない場合などに。。
何か良い方法がありましたら、是非教えて下さい!
※追記
nginxのプロキシのタイムアウトも設定する必要がありました!
こんな感じでhttpセクションに書いておくと良いです。
proxy_connect_timeout 160; proxy_read_timeout 160; proxy_send_timeout 160;