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

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

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と異なり認証キーを必要としないのは魅力的ですね。

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

Django model の データを JSON化して利用する。 2018/07/26

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

 

本エントリでは、前回記事で書いたAPIを叩くときの検索ワードとして、データベースに登録したものを使用できるようになることを目指します。

 

本記事では前記事でも扱ったproject, app に加えて

song というアプリを同じプロジェクト内に作成して進めることとします。

 

project : myTutorial

app : myTutorial/api

         myTutorial/song


kaeru-nantoka.hatenablog.com

・目次

 1:準備

 2:実践

3:おまけ

4:参考にした記事

 

1:準備

まず、今回扱うモデルとデータは以下の通りです。

# song/models.py

from django.db import models

class Song(models.Model):
    song_name = models.CharField(max_length=50)

    def __str__(self):
        return self.song_name

    # Djangoモデル のデータを返す関数
    def to_dict(self):
        return self.song_name

DBにはadmin画面から入れておきます。
今回は、 

Lemon (米津玄師) ultrasoul(B'z)

の2曲を入れています。


次に、取得したデータをウェブ上に表示する準備をします。

#api/urls.py

from django.urls import path
from api import views

app_name = 'api'
urlpatterns = [

    path('hoge/bring_mdl_data/', views.bring_mdl_data, name='bring_mdl_data')
]
#myTutorial/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('song/', include('song.urls')),
    path('admin/', admin.site.urls),
    path('api/', include('api.urls')), 
]


2:実践

#api/views.py 

import json
from django.http import HttpResponse
import requests

from song.models import Song

#pythonでJSONファイルを返す時に記述

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 bring_mdl_data(request, song_name=None):

    #クエリセットという形式で登録されている曲を全て持ってくる
    items = Song.objects.all() 

    k = json.dumps([ items[0].to_dict() ])
    # items[0] に格納されている Lemon がJSON形式に変換されて k に代入される

    return render_json_response(request, k)
    # JSON形式の k をウェブ上に表示する。 

127.0.0.1:8000/song/hoge/bring_mdl_data/

に "[\"Lemon\"]"

が表れたら成功です!!


3:おまけ

こうしてDjango model よりWebページ上に引っ張ってきたデータは
フロントのJSで fetch( ' 127.0.0.1:8000/song/hoge/bring_mdl_data/ ' )
でアクセスできます!
(ちなみに console.log( 返り値 ) で Lemon が表示されます。)


4:参考記事

↓こちらの方の記事を参考にしました。ありがとうございました!

DjangoでJSONを使うための一考察 SQLの最適化など - グロブ


以上です!

PythonでAPIからほしい値を取得する。(2018/07/25)

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

 

自作Djangoアプリの制作過程で YouTube Data

API (https://developers.google.com/youtube/v3/) を扱うことがあり、この時にハマったことと解決策を書いていきます。

前提として、今回のDjangoアプリは

project名:myTutorial

 app名:api

であるとして読み進めください。

 

  • 目次
  1. ほしい値 (目的)
  2. videoIdとは?
  3. 何ができるの?
  4. 解決策(お急ぎの方はここからお読みください!)
  5. どうつまづいたか
  6. まとめ
  •  内容

1.  YouTube Data API を叩いて得られるオブジェクトの中に、

「 videoId 」というものがあります。本エントリではDjangoアプリでこれを取得してHTML上に表示します。

 

2.  videoIdとは「M7lc1UVf-VE」のようなもので動画一つ一つを識別する一つのタグのようなものです。

(ちなみにこれはYouTube公式のサンプル動画のID)

 

3.  videoIdで何ができるの?

以下のようなものをhtmlに埋め込む。

 

<iframe width="640" height="360" src="https://www.youtube.com/embed/M7lc1UVf-VE" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>

 

すると、

 

 

このように簡単に動画をWebページ上に表示できます!

赤太字で表したのがこの動画のvideoIdです。

今回はこれをDjangoを用いてAPIから取得します。

 

 

4.  解決策

お待たせしました本エントリの本題です。

まず、実際に書き込むのは、

 api/urls.py  (デフォルトでは無いので要作成)

 api/views.py

    myTutorial/urls.py

の3つです。

 

*(api/urls.py) 

from django.urls import path
from api import views

 

app_name = 'api'
urlpatterns = [

    path('foge/hoge/', views.hogehoge, name='hogehoge'),
]

 

*(api/views.py)

import json,  requests
from django.http import HttpResponse

 

def youtube_search(request):


YouTube_API_KEY = "Your_API_KEY"

url = "https://www.googleapis.com/youtube/v3/search?key=" + YouTube_API_KEY + "&part=snippet&q=" + (検索ワード) +"&type=videos"

headers = {"content-type": "application/json"}
r = requests.get(url, headers=headers)
data = r.json()
vId = data["items"][1]["id"]["videoId"]

return HttpResponse(vId)

 

*(myTutorial/urls.py)

from django.contrib import admin
from django.urls import include,path

 

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('api.urls')), # 追加
]

 

これで、localhost/api/foge/hoge/ で検索すると

webページ上に M7lc1UVf-VE が表示されます!

 

5. 私がつまずいたのは取得したオブジェクトの要素を取得するところです。

 

data["items"][1]["id"]["videoId"]

とあるように、videoIdは返り値dataの中のitemsという要素の2つ目の中のidの中にあります。

 

私は当初 JavaScriptAPIを叩いていたのですが、JSはオブジェクトの要素にアクセスする時、

 

data.items[1].id.videoId

というようにアクセスします。

 

PythonAPIを叩いてみる!

Pythonのrequestsを使ってみる!

といった記事はよく見かけたのですがその要素を取得することにフォーカスした記事を見つけられなかったので本エントリを書いたのでした。

 

6.  まとめ

    オブジェクトの要素を取得する方法。

 

    JS        =>  data.items[1].id.videoId

    Python =>  data["items"][1]["id"]["videoId"]

 

以上です!