フォームでの検索条件入力で
ぐるなびPhotoSearchAPIからのデータが受け取れないか試しています。
口コミデータから名詞のみ抽出して表示させるないようで作っています。
views.py の内容が悪いのか、エラーメッセージはないものの内容が表示されません。
以下の東京・卵のようにapiからの情報を表示するためにはどうすればいいのでしょう?
API利用コードは以下の方のものを参考とさせていただきました。
非常に助かりました。
https://teratail.com/questions/145330
<forms.py> from django import forms class Form(forms.Form): 地域 = forms.CharField() 食材 = forms.CharField()
<urls.py> from django.urls import path from . import views app_name = 'analysis' urlpatterns = [ path('', views.IndexView.as_view(), name = 'index'), ]
<views.py> import sys import urllib import urllib.parse import urllib.request import json import re #正規表現で特定のワードを検索 from django.shortcuts import render, redirect from django.views import generic from janome.tokenizer import Tokenizer from operator import add from analysis.forms import Form def gnavi_api(request): form = Form(request.POST) if form.is_valid(): area = form.cleaned_data['地域'] menu_name = form.cleaned_data['食材'] keyid = "" url = "https://api.gnavi.co.jp/PhotoSearchAPI/v3/" #input("メニュー名を入力してください:") encoding = 'utf-8' query = [ ("format", "json"), ("keyid", keyid), ("area", area.encode(encoding)), ("menu_name", menu_name.encode(encoding)), ("hit_per_page", 50), # default:15, max:50 ("offset", 1), # 検索開始位置(デフォルト:1) ] # Generate URL. url += "?{0}".format(urllib.parse.urlencode(query)) # Execute API try: result = urllib.request.urlopen(url).read() return result except: raise Exception("APIアクセスに失敗しました。") def parse_json(json_f): # parse json parsed_json = json.loads(json_f) # Check error. if 'error' in parsed_json: if 'message' in parsed_json: raise Exception('{0}'.format(parsed_json['message'])) else: raise Exception('データ取得に失敗しました') # Save json. with open('output.json', 'w') as f: json.dump(parsed_json, f) # 該当件数 total_hit_count = parsed_json['response'].get('total_hit_count', 0) # 1回のリクエストで得る最大投稿件数(デフォルト:15、上限:50) hit_per_page = parsed_json['response'].get('hit_per_page', 0) # ヒット件数が0以下なら終了 if total_hit_count <= 0 or hit_per_page <= 0: raise Exception("指定した内容ではヒットしませんでした。") #input_num = int(input("追加で取得するコメントの文章数を入力してください: ")) line = [] # 応援口コミデータ取得 for (_, seq) in enumerate(parsed_json['response']): try: photo = parsed_json["response"]["{0}".format(seq)]["photo"] except: continue # コメント取得 if(photo.get('comment', None)): userComment = photo.get('comment') removeCharacters = str.maketrans({ '\r': '', '\n': '', '\t': '', '\u3000':'', }) userComment = userComment.translate(removeCharacters) line.append(userComment) return line def main(request): result = gnavi_api(request) return parse_json(result) def token(request): t = Tokenizer() texts = main(request) list_all = [] for tokens in texts: i = [token.surface for token in t.tokenize(tokens) if token.part_of_speech.startswith('名詞')] list_all.append(i) ex_list_all = [] for s in list_all: ex_list_all.extend(s) return ex_list_all class IndexView(generic.TemplateView): template_name = 'analysis/forms.html' def get(self, request): form = Form() return render(request, self.template_name, {'form':form}) def post(self, request): form = Form(request.POST) if form.is_valid(): area = form.cleaned_data['地域'] menu_name = form.cleaned_data['食材'] args = {'form':form, 'area':area, 'menu_name':menu_name} return render(request, self.template_name, args) def re(self, request): form = Form(request.POST) name = token(request) context = { 'form':form, 'name':name, } return render(self.request, self.template_name, context)
<forms.html> {% extends 'analysis/base.html' %} {% block content %} <h2>ぐるなび応援口コミ</h2> <div class="container"> <form action="" method="post"> {{ message }} {% csrf_token %} {{ form.as_p }} <button type="submit" class="btn btn-success">検索</button> </form> <h2>{{ area }}</h2> <h2>{{ menu_name }}</h2> <h2>{{ name }}</h2> </div> {% endblock %}
あなたの回答
tips
プレビュー