（初心者向け）DjangoでシンプルなwebAPIを作ってみる

# 概要
　この記事は初心者の自分がRESTfulなAPIとswiftでiPhone向けのクーポン配信サービスを開発した手順を順番に記事にしています。技術要素を1つずつ調べながら実装したため、とても遠回りな実装となっています。

　今回は[pipenvで作ったDjangoの環境でpythonを動かしてみる]
(https://qiita.com/Ajyarimochi/items/0964d314c8bd968fcc80)で作った環境で、Djangoの機能を使ったシンプルなwebAPIを作ります。

### 参考
* Python Django 超入門　掌田津耶乃 著　秀和システム
* [WebAPIについての説明](https://qiita.com/busyoumono99/items/9b5ffd35dd521bafce47)

### 環境
Mac OS 10.15
VSCode 1.39.2
pipenv 2018.11.26
Python 3.7.4
Django 2.2.6

### webAPIの仕様
クーポンコードをリクエストされると、クーポンコードに紐づくクーポンの内容をHTTPでレスポンスする。

* リクエストパラメータ：coupon_code
* coupon_codeに0001を指定すると「1000円引きクーポン！」という文字列が返ってくる
* coupon_codeに0002を指定すると「10%引きクーポン！」という文字列が返ってくる
* コードを指定しない又は存在しないコードを入力すると「Error:Not found coupon code!」という文字列が返ってくる


# 手順

* couponのdjangoアプリを作成
* views.pyにレスポンス処理を実装
* couponアプリ配下にurls.pyを作成
* プロジェクト配下のurls.pyを編集
* 動作確認

### couponのdjangoアプリを作成
pipenv shell コマンドでpipenvの仮想環境に入り、manage.pyがあるディレクトリに移動します。
<img width="581" alt="into-pipenv-directry-mask.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526594/c0ba4f08-0b2c-bf67-22c0-02aedc6462d3.png">

couponという名前のdjangoアプリを作成します。
<img width="368" alt="make-coupon-app.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526594/df5110b7-3231-f577-7304-c1316e355da9.png">

VSCodeでフォルダを開くとcouponアプリが出来ています。
<img width="325" alt="check-making-app-vscode.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526594/e137d22d-ca05-33be-9b41-f833a5ac35c3.png">



### views.pyにレスポンス処理を実装


下記のとおり、couponという関数を作り、クーポンの内容をハードコーディングしました。リクエスト変数（coupon_code）で送られてくるクーポンのコードに応じて、if文でクーポンの出しわけをします。レスポンスはDjangoの`HttpResponse`メソッドを使ってHttpで返します。

```python:views.py
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def coupon(request):
    if 'coupon_code' in request.GET:
        coupon_code = request.GET['coupon_code']
        if coupon_code == '0001':
        　　result = '1000円引きクーポン！'
        elif coupon_code == '0002':
            result = '10%引きクーポン！'
        else:
            result = 'Error:Not found coupon code!'
        return HttpResponse(result)
```

### couponアプリ配下にurls.pyを作成
次はパスの設定をします。まずは couponアプリの配下に `urls.py`を新規作成します。

```python:coupon/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.coupon, name='coupon'),
]
```


### プロジェクト配下のurls.pyを編集
次はプロジェクト配下のurls.pyを編集します。`urlpatterns`の部分に `path('coupon/',include('coupon.urls'))`を追加しました。

```python:ami_coupon_api/urls.py
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', include('hello.urls')),
    path('coupon/', include('coupon.urls'))
]
```


### 動作確認
変更を保存し、djangoのwebサーバを起動します。

```
$ python manage.py runserver
```

ブラウザで下記のURLにアクセス。
`http://127.0.0.1:8000/coupon/?coupon_code=0001`
正しいレスポンスが変える事を確認。
<img width="746" alt="test-code-0001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526594/cf28e7de-4a58-aadd-101b-1b37c81d14be.png">

他のパラメータを入力するパターンも確認

クーポンコード0002のクーポンをリクエスト
`http://127.0.0.1:8000/coupon/?coupon_code=0002`
<img width="746" alt="test-code-0002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526594/42d65eff-f9a8-82a5-e781-595c76cb7233.png">


存在しないクーポンコードを指定した場合
`http://127.0.0.1:8000/coupon/?coupon_code=0003`
<img width="748" alt="test-code-0003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526594/4d38b90a-8ae3-7aa7-dc64-e8eb6c43ba4b.png">



以上で超シンプルなwebAPIの実装が出来ました。ここから下記のように改造し、実用に耐えうるwebAPIにしていきます。

* Json形式でレスポンスする
* ハードコーディングじゃなくてDBでクーポン情報を管理する
* Rest full なAPIに改造する

次回は、[学習のためにDjangoのテンプレート機能を使ってみます](https://qiita.com/Ajyarimochi/items/9d64b13321f0779fc986)