djangoRESTAPI作成


DjangoでRESTApiの実装したときの忘備録．

基本的には，以下を参考に実装．  
django : [django](https://docs.djangoproject.com/ja/2.0/intro/tutorial01/)  
djangoRESTAPI : [Django REST Frameworkを使って爆速でAPIを実装する](https://qiita.com/kimihiro_n/items/86e0a9e619720e57ecd8)

[GitHub](https://github.com/sasayabaku/djangoTutorial/tree/master/djangoRESTApi)にコードは置いてます．


# インストール

```bash
pip install django django-filter djangorestframework
```

参考: [Home - Django REST framework](http://www.django-rest-framework.org)

# Djangoプロジェクトの作成

```bash
django-admin startproject mySite
```

# DjangoをApacheにデプロイ
## 環境
Ubuntu 16.04 LTS  
Apache 2.4.18  
Django 1.11.7


## ディレクトリ構成
```bash
/var  
┗ www/
    ┣ html (今回は関係なし)
    ┗ djangoRESTApi/  (GitHub Repository Directory)  
        ┗ djangoREST/ (Project Directory)
            ┝ manage.py
            ┝ db.sqlite3
            ┝ blog/         (Application Directory)
            ┝ static/       (Static Files Directory)
            ┗ djangoREST/   (Application Directory)
```

## Django
### ホスト名変更
`localhost`では，他のPCからアクセス可能にするためにホスト名をIPアドレスに変更．  
下記のように，`ALLOWED_HOSTS`にサーバのIPアドレスを設定．

```djangoREST/setting.py
ALLOWED_HOSTS =['132.423.423.42']
```

### 静的(Static)ファイルの設定
今回は，Django REST Framework を実装しているため，Python3のライブラリのPathにレイアウト用のBootStrapやjQueryが配置されている．なので，パスを通す．  

```py
DJANGO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_ROOT = os.path.dirname(DJANGO_ROOT)
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
```
* `DJANGO_ROOT` : Djangoのルートディレクトリ
* `PROJECT_ROOT` : Djangoプロジェクトのルートディレクトリ (ex. `/var/www/djangoRESTApi/djangoREST/`)
* `STATIC_ROOT` : Djangoの静的ファイルの格納場所  (ex. `/var/www/djangoRESTApi/djangoREST/static/`)

以下のコマンドで，`STATIC_ROOT`の場所にアプリで使用するstaticファイルが集められる．

```py
python manage.py collectstatic
```

これで，`static`にcssやjsファイルが保存される．

## Apache
### WSGIの使用を宣言
以下を追記
```apache2.conf
WSGIScriptAlias /django /var/www/djangoRESTApi/djangoREST/djangoREST/wsgi.py  
```
* `WSGIScriptAlias` : スキーマとdjangoAppを紐付け (http://localhost/django でdjangoREST のアプリケーションに接続する)

### WSGIのPython設定
WsgiでPythonをApacheに伝えるために，Python関連のパスを定義する必要がある．
`/etc/apache2/apache2.conf`に追記

```apache2.conf
WSGIPythonPath /var/www/djangoRESTApi/djangoREST
WSGIPythonPath /usr/local/lib/python3.5/dist-packages
WSGIPythonHome /usr/bin/python
Alias /static /var/www/djangoRESTApi/djangoREST/static
```
* `WSGIPythonPath` : Pythonモジュールのパス設定 (1行目: djangoAppのパス，2行目: Djangoのライブラリパス)
* `WSGIPythonHome` : Python本体のライブラリパス  

参考:   
[Django、静的ファイルのデプロイ（Apache） - naritoブログ](https://torina.top/detail/287/)  
[Apache と mod_wsgi 環境で Django を使う方法 — Django 1.4 documentation](http://docs.djangoproject.jp/en/latest/howto/deployment/wsgi/modwsgi.html)  

### 各ディレクトリの設定
続けて `/etc/apache2/apache2.conf`に追記

```apache2.conf
<Directory /var/www/djangoRESTApi/djangoREST/djangoREST>
<Files wsgi.py>
        Require all granted
</Files>
</Directory>

<Directory /var/www/djangoRESTApi/djangoREST/static/rest_framework>
        Options Indexes FollowSymLinks
        Require all granted
</Directory>
```
* 1つ目のディレクトリ (`/var/www/djangoRESTApi/djangoREST/djangoREST`)  
    - `wsgi.py`へのアクセスを有効化  
    - Apache2.4以降から，`Require all granted`で有効化
* 2つ目のディレクトリ (`/var/www/djangoRESTApi/djangoREST/static/rest_framework`)  
    - REST frameworkで使用されているcss,jsファイルをアクセス可能にする．
    - `Options Indexes FollowSymLinks`でシンボリックリンクを許可


# 未解決問題
## MAMPでDjangoをデプロイ
以下の環境で同様のことを，自分の環境でするとダメでした・・・  
* Mac
* MAMP
* Python3.5 (pyenvで構築)

[mod_wsgi Document](http://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html#virtual-environment-and-python-version)を見ると`Virtual Environment and Python Version`の項に，`Virtual 環境ではwsgiが使えない`と言う記述があったので，今回は断念しました．