かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

Python Django で iTunes API を 簡単に叩く。 2018/7/31

かえるるる(@kaeru_nantoka)です。



本エントリでは、Django プロジェクト内にて PythoniTunes API を叩き楽曲情報のJSONデータをhtml上に表示します。

この時検索条件を指定するのですが、この時に渡すデータをDjango model から持ってくることとします。



尚、今回は↓ の方のエントリを参考にさせて頂きました。
iTunes APIの分かりやすい使い方解説 – ハックマン.com


jsのajaxを使用してわかりやすく説明してくださっています。ありがとうございました。



目次:

1- 主なプロジェクト構成

2- 今回触るファイル

3- ソースコード

4- まとめ


実践 :

1- プロジェクト構成


myProject/myApp --- 曲情報を格納しているアプリ

myProject/myAPI ---  APIを叩いてhtmlレンダリングするアプリ


2- 今回触るファイル


myApp/model.py

myAPI/views.py, myAPI/urls.py


3- ソースコード

i.

    
   #myApp/model.py
   from django.db import models

class Singer(models.Model):

    singer_name = models.CharField(max_length=50)
 
    def __str__(self):
        return self.singer_name 

Singerクラスというものを定めています。

localhost/adminの管理画面か、shellスクリプトで歌手名を登録しておきましょう。
今回は、「米津玄師」「Perfume」を登録しておきました。

__str__() という関数はありますね。これは、歌手名を String データに変換して返す関数です。
Djangoモデルでは「クエリ」という形式でデータを格納しています。
それを扱いやすくするために、Stringという形式に変換するのがこの関数の役目です。


ii.

    
   #myAPI/views.py

   import json
from django.http import HttpResponse
import requests

from myApps.models import Singer

def render_json_response(request, data, status=None):
    #response を JSON で返却
    json_str = json.dumps(data, ensure_ascii=False, indent=2)
    callback = request.GET.get('callback')
    if not callback:
        callback = request.POST.get('callback')  # POSTでJSONPの場合
    if callback:
        json_str = "%s(%s)" % (callback, json_str)
        response = HttpResponse(json_str, content_type='application/javascript; charset=UTF-8', status=status)
    else:
        response = HttpResponse(json_str, content_type='application/json; charset=UTF-8', status=status)
    return response

def iTunes_search(request):

    item_data = Singer.objects.all()

    lz = []
    data_list = []

    sss = 0
    maxNum = "5"

    for x in item_data:
        z = x.__str__()
        lz.append(z)
        keyWord = lz[sss]
        print(lz[sss])

        url = 'https://itunes.apple.com/search?lang=ja&entry=music&media=music&country=JP&limit='+ maxNum +'&term=' + keyWord

        headers = {"content-type": "application/json"}
        r = requests.get(url, headers=headers)
        data = r.json()
        data_list.append(data)
        print(data_list)

        sss += 1

    return render_json_response(request, data_list) #JSON 

・本エントリの本命の、iTunes_search()関数です。
・item_data = Singer.objects.all() はSingerという名前でDBに格納されているもの全てをクエリという形式で取得します。今回は、「米津玄師」「Perfume」という値がやってきます。
・lz と data_list という配列を用意します。クエリできた値を__str__()で文字列に変換し、配列 lz にしまいます。
・lz にしまったそれぞれの値を KeyWord として urlに渡し、そのurl でAPIを叩きその返り値のJSONデータを data_list[]に格納。
・歌手の人数分これを繰り返し、最後にまとめてJSONオブジェクトとしてHTMLに投げるといった具合です。

iii.

    
    #myAPI/urls.py

    from django.urls import path
from api import views

app_name = 'api'
urlpatterns = [

    path('iTunes_search/', views.iTunes_search, name='iTunes_search'),
]

ここでは、myAPI/views.py で投げられたJSONオブジェクトを表示するためのurl を作っています。

localhost/myAPI/iTunes_seach/ で検索したら先ほど投げたJSONデータが表示されます。

f:id:kaeru_nantoka_py:20180731014329p:plain

私の場合はこのようになりました。
下にスクロールしていったらPerfumeの曲も5曲出ています。


4- まとめ
このように簡単に iTunes APIを叩いて楽曲情報を取得することができました。

youTube APIと異なり認証キーを必要としないのは魅力的ですね。

以上、ありがとうございました。