djangoと「ぐるなび」のAPIを使ってレストランの検索結果を表示してみた

2022年5月3日

djangoと「ぐるなび」のAPIを使ってレストランの検索結果を表示してみた

ぐるなびのAPIを使用してレストラン検索をしてみます。前回もpythonでAPIを叩いてみましたが、今回はDjnagoを使って結果をブラウザに表示させてみましょう。

早速下がその動きになります。

プログラム

views.pyは下の通りです。
「requeests」と「json」は「pip」などを使ってインストールしておきましょう。
「urls.py」から呼び出されるのは「search_restaurant」です。
リクエストが「POST」だった場合は「key_word」を「class GrunaviAPI」に送り、パラメータに設定し検索を行います。
「class GrunaviAPI」はインスタンス化した時に、コンストラクタで「url」と「params」の初期設定を行っています。


from django.shortcuts import render
import requests
import json
class GrunaviAPI:
    def __init__(self):
        self.url = "https://api.gnavi.co.jp/RestSearchAPI/v3/"
        self.params={}
    def search_restaurant(self, key_word):
        #パラメータの設定
        self.params["keyid"] = "xxxxxxxxxx"
        self.params["freeword"] = key_word
        #リクエスト結果
        result_api = requests.get(self.url, self.params)
        result_api = result_api.json()
        #配列宣言
        restaurant_dicts = []
        #リクエスト結果格納
        count = len(result_api['rest'])
        for count in range(count):
            restaurant_dict = {}
            restaurant_dict['name']     = result_api['rest'][count]['name']
            restaurant_dict['address']  = result_api['rest'][count]['address']
            restaurant_dict['areaname'] = result_api['rest'][count]['code']['areaname']
            restaurant_dict['category'] = result_api['rest'][count]['category']
            restaurant_dicts.append(restaurant_dict)
        return restaurant_dicts
def search_restaurant(request):
    if request.method == "POST":
        key_word = request.POST['key_word']
        grunaviInstance = GrunaviAPI()
        restaurant_dicts = grunaviInstance.search_restaurant(key_word)
        context = {
            'key_word': key_word,
            'restaurant_dicts' : restaurant_dicts,
        }
    else:
        context = {
            'key_word': '',
        }
    return render(request, 'app/search_restaurant.html', context)

search_restaurant.htmlは下の通りです。
リスト「restaurant_dicts」の中に辞書「restaurant_dict」があるのでループで取り出してあげています。
取り出した辞書を「restaurant_dict.[key]」でテンプレート上に表示しています。


{% extends 'app/base.html' %}
{% block content %}
        {{ message }}
        <form action="." method="post" class="search_form">{% csrf_token %}
        <input type='text' id="key_word" name="key_word" value="{{key_word}}" class="search_text">
        <input type="submit" value="search" class="search_button">
        </form>
    <table class = 'data_record'>
        <tr>
            <th>店名</th>
            <th>アドレス</th>
            <th>エリア</th>
            <th>カテゴリー</th>
        </tr>
        {% for restaurant_dict in restaurant_dicts %}
        <tr>
            <td>{{ restaurant_dict.name }}</td>
            <td>{{ restaurant_dict.address }}</td>
            <td>{{ restaurant_dict.areaname }}</td>
            <td>{{ restaurant_dict.category }}</td>
        </tr>
        {% endfor %}
    </table>
{% endblock %}                         
YouTube

2022年5月3日