PythonとFlaskでWebサーバを立ち上げる


- 単体のPythonスクリプトとか、GoogleAppEngineで簡単なプログラムを動かしたことはあるんですが、単体でWebプログラムを動かしたことはないのでやってみることにします。

## 環境構築

- いろんなところからのコピペなので余分な作業があるかもしれません。
- 環境はMac(El Capitan)です。
- brewとpipコマンドは以前に入れてました。

### pyenvのインストール

- pythonのバージョン切り替え環境です。ユーザーディレクトリにpython本体がインストールされます。

```
% brew link autoconf pkg-config
% brew install pyenv
% brew install pyenv-virtualenv
```

- /usr/local/以下の書き込みが禁止されてる場合には所有権等を変更してください。

### virtualenvのインストール

- 環境ごと仮想化する（？）コマンドらしいです。
- virtualenvコマンドはpython2系だけのようで3系は別コマンドだそうなんですが、とりあえずvirtualenvで

```
%  pip install virtualenv
```

## pythonの設定


### 環境変数

- そのままだと、システムのpythonを使ってしまうのでpyenvのpythonを使うように環境変数を変更します。
- 私はzshなので.zshrcに書いてますが、標準なら.bash_profileとかに書いてください。

```
% echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
% echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
% echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

### 各バージョンのインストール

- とりあえず2.7.11と3.5.1というバージョンをインストールしてみます。

```
% pyenv install 2.7.11
% pyenv install 3.5.1
```

- インストールの確認です。

```
% pyenv versions                                                                           [~]
* system (set by /Users/user/.python-version)
  2.7.11
  3.5.1
```

- system設定に従う、明示的に2.7.11、3.5.1という３つがでてきます。

## プログラムの設定

- まず、システムを動かすプログラムディレクトリをつくってそこに移動します。

```
% cd /[path]/proj
```

- ここで、virtualenvコマンドで仮想の環境を生成します。

```
% virtualenv testapp
```

- /[path]/proj/testapp <- これが環境ごっそりなプログラムフォルダになります。

- testappにある仮想環境に切り替えます。シェルにも(testapp)と付くので切り替わったのがわかります。

```
% source testapp/bin/activate
(testapp) [user]%    
```
### ライブラリのインストール

- Flaskというを入れます。

```shell
(testapp) [user]% pip install Flask

Collecting Flask
  Using cached Flask-0.11.1-py2.py3-none-any.whl
Collecting click>=2.0 (from Flask)
Collecting Werkzeug>=0.7 (from Flask)
  Using cached Werkzeug-0.11.10-py2.py3-none-any.whl
Collecting Jinja2>=2.4 (from Flask)
  Using cached Jinja2-2.8-py2.py3-none-any.whl
Collecting itsdangerous>=0.21 (from Flask)
Collecting MarkupSafe (from Jinja2>=2.4->Flask)
Installing collected packages: click, Werkzeug, MarkupSafe, Jinja2, itsdangerous, Flask
Successfully installed Flask-0.11.1 Jinja2-2.8 MarkupSafe-0.23 Werkzeug-0.11.10 click-6.6 itsdangerous-0.24

(testapp) [user]% pip list
click (6.6)
Flask (0.11.1)
itsdangerous (0.24)
Jinja2 (2.8)
MarkupSafe (0.23)
pip (8.1.2)
setuptools (23.0.0)
Werkzeug (0.11.10)
wheel (0.29.0)

```

### こんな感じでファイル群ができました。

```
(testapp) [user]% tree -L 2
.
└── testapp
    ├── bin
    ├── include
    ├── lib
    └── pip-selfcheck.json

4 directories, 1 file
```

### こんなプログラムを置きます。

```python:hello.py
# coding: utf-8

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

@app.route('/ja')
def hello_world_ja():
    return 'こんにちは 世界！'

if __name__ == '__main__':
    app.run()
    
```

- ルールがまだ良くわからないのでこんなapp/hello.pyに置いてみました。

```
(testapp) [user]% tree -L 3                                              [~/Desktop/python-dev/proj]
.
└── testapp
    ├── app
    │   └── hello.py
    ├── bin
    ├── include
    ├── lib
    └── pip-selfcheck.json
```

## 実行します！

```
(testapp) [user]% python testapp/app/hello.py
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```

- 5000ポートで動いたようです。

## 動作確認

- ブラウザでもいいですけど、もうひとつターミナル開いて確認します。

```
% curl http://localhost:5000                                      
Hello World!
% curl http://localhost:5000/ja
こんにちは 世界！
```

- 動きました〜