見出し画像

FlaskでササっとWebアプリケーション作成 〜応用編③外部のAPIと画面入力を動的に反映させる

割引あり

前回までにざっくりとFlaskのなんとなくを学びました。
今回はWebブラウザの画面上から入力した値を利用して、外部のAPIで取得した情報を画面上に表示させるという応用編をやっていきたいと思います。

1. 完成イメージ

今回は天気を知りたい地域を指定したら、その地域の天気情報や気温などが表示されるWebアプリケーションを作ってみたいと思います。

その際、自らがDB等で保有する情報を表示するのでなく、外部のAPIを利用することでFlaskのササっと感を活かしたいと思います。

完成形は以下です。

(1) Webアプリケーションイメージ

都市のIDを入力してボタンを押下する
取得した情報を表示する(検索画面にも戻れる)

(2) 利用した外部サービス(API)

今回利用させていただいたのは、livedoorの天気予報APIです。

所定のフォーマットで、所定のURLにリクエストを送信すると、JSON形式という辞書型のデータでレスポンスが受け取れます。

どんな感じかざっくりみてみましょう。

2. JSONファイルを読み込む

https://weather.tsukumijima.net/api/forecast/city/400040 にrequestsモジュールを使って、リクエストを送信してレスポンス情報をrという変数に格納してます。(❶)

jsonモジュールのloadsメソッドで、引数として渡したレスポンスのテキストをjsonファイルとしてweather_json変数に格納します。(❸)

(1)APIを利用する

test.py

import requests
import json

#❶
r = requests.get("https://weather.tsukumijima.net/api/forecast/city/400040")
#❷
weather_json = json.loads(r.text)

print(weather_json)

printで出力すると、どういうデータが返ってくるのかが分かります。

{
 'publicTime': '2024-03-24T17:00:00+09:00', 
 'publicTimeFormatted': '2024/03/24 17:00:00', 
 'publishingOffice': '福岡管区気象台', 
 'title': '福岡県 久留米 の天気', 
 'link': 'https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=400000', 
 'description': {
                  'publicTime': '2024-03-24T16:35:00+09:00', 
                  'publicTimeFormatted': '2024/03/24 16:35:00', 
                  'headlineText': '', 
                  'bodyText': '\u3000福岡県は、前線や湿った空気の影響により雨や曇りとなっています。\n\n\u300024日は、前線や湿った空気の影響により雨や曇りとなるでしょう。\n\n\u300025日は、前線や湿った空気の影響によりおおむね曇りで次第に雨となり、夜は雷を伴う所があるでしょう。\n\n<天気変化等の留意点>\n\u300024日18時から25日18時までに予想される1時間降水量は、多い所で、筑後地方で5ミリ、24日18時から25日18時までに予想される24時間降水量は、多い所で、筑後地方で15ミリの見込みです。', 
                  'text': '\u3000福岡県は、前線や湿った空気の影響により雨や曇りとなっています。\n\n\u300024日は、前線や湿った空気の影響により雨や曇りとなるでしょう。\n\n\u300025日は、前線や湿った空気の影響によりおおむね曇りで次第に雨となり、夜は雷を伴う所があるでしょう。\n\n<天気変化等の留意点>\n\u300024日18時から25日18時までに予想される1時間降水量は、多い所で、筑後地方で5ミリ、24日18時から25日18時までに予想される24時間降水量は、多い所で、筑後地方で15ミリの見込みです。'
                 }, 
                 'forecasts': [
                                {
                                 'date': '2024-03-24', 
                                 'dateLabel': '今日', 
                                 'telop': '雨時々止む', 
                                 'detail': {
                                             'weather': '雨\u3000夜のはじめ頃\u3000くもり', 
                                             'wind': '北の風\u3000後\u3000北東の風', 
                                             'wave': '0.5メートル'
                                           }, 
                                 'temperature': {
                                             'min': {
                                                      'celsius': None, 
                                                      'fahrenheit': None
                                                    }, 
                                             'max': {
                                                      'celsius': None, 
                                                      'fahrenheit': None
                                                    }
                                                 }, 
                               'chanceOfRain': {
                                                'T00_06': '--%', 
                                                'T06_12': '--%', 
                                                'T12_18': '--%', 
                                                'T18_24': '60%'
                                               }, 
                               'image': {
                                         'title': '雨時々止む', 
                                         'url': 'https://www.jma.go.jp/bosai/forecast/img/302.svg', 
                                         'width': 80, 
                                         'height': 60
                                        }
                               },
                               {
                                'date': '2024-03-25', 
                                'dateLabel': '明日', 
                                'telop': '曇のち雨', 
                                'detail': {
                                           'weather': 'くもり\u3000夕方\u3000から\u3000雨\u3000所により\u3000夜\u3000雷\u3000を伴う', 
                                           'wind': '北東の風', 
                                           'wave': '0.5メートル'
                                          }, 
                                'temperature': {
                                                'min': {
                                                        'celsius': '14', 
                                                        'fahrenheit': '57.2'
                                                       }, 
                                                'max': {
                                                        'celsius': '17', 
                                                        'fahrenheit': '62.6'
                                                       }
                                               }, 
                                'chanceOfRain': {
                                                 'T00_06': '40%', 
                                                 'T06_12': '30%', 
                                                 'T12_18': '80%', 
                                                 'T18_24': '90%'
                                                }, 
                                'image': {
                                          'title': '曇のち雨', 
                                          'url': 'https://www.jma.go.jp/bosai/forecast/img/212.svg', 
                                          'width': 80, 
                                          'height': 60
                                         }
                               }, 
                               {
                                'date': '2024-03-26', 
                                'dateLabel': '明後日', 
                                'telop': '雨のち曇', 
                                'detail': {
                                           'weather': '雨\u3000後\u3000くもり', 
                                           'wind': '北の風',  
                                           'wave': '0.5メートル'
                                          }, 
                                'temperature': {
                                                'min': {
                                                        'celsius': '11', 
                                                        'fahrenheit': '51.8'
                                                       }, 
                                                'max': {
                                                        'celsius': '15', 
                                                        'fahrenheit': '59'
                                                       }
                                               }, 
                                'chanceOfRain': {
                                                 'T00_06': '90%', 
                                                 'T06_12': '90%', 
                                                 'T12_18': '90%', 
                                                 'T18_24': '90%'
                                                }, 
                                'image': {
                                          'title': '雨のち曇', 
                                          'url': 'https://www.jma.go.jp/bosai/forecast/img/313.svg', 'width': 80, 'height': 60
                                         }
                               }
                              ], 
                               'location': {
                                            'area': '九州', 
                                            'prefecture': '福岡県', 
                                            'district': '筑後地方', 
                                            'city': '久留米'
                                            }, 
                               'copyright': {
                                             'title': '(C) 天気予報 API(livedoor 天気互換)', 
                                             'link': 'https://weather.tsukumijima.net/', 
                                             'image': {'title': '天気予報 API(livedoor 天気互換)', 
                                             'link': 'https://weather.tsukumijima.net/', 
                                             'url': 'https://weather.tsukumijima.net/logo.png', 
                                             'width': 120, 
                                             'height': 120
                                            }, 
                               'provider': [
                                            {
                                             'link': 'https://www.jma.go.jp/jma/', 
                                             'name': '気象庁 Japan Meteorological Agency', 
                                             'note': '気象庁 HP にて配信されている天気予報を JSON データへ編集しています。'
                                            }
                                           ]
                           }
                  }

(2) 日付と天気を取り出す

辞書型のようにキーを指定したり、辞書の値がリストであればリストの要素を指定したりしながら、データを取り出します。

日付は、forecastsというキーの値であるリストの1番目の要素内にdateというキーの値として格納されています。(❸)

天気情報は、forecastsというキーの値であるリストの1番目の要素内にtelopというキーの値として格納されています(❹)

test.py

import requests
import json


r = requests.get("https://weather.tsukumijima.net/api/forecast/city/400040")
weather_json = json.loads(r.text)

#日付と天気を取り出す
forecasts_date = weather_json["forecasts"][0]["date"] #❸
forecasts_telop= weather_json["forecasts"][0]["telop"] #❹

print(forecasts_date)
print(forecasts_telop)

出力結果

2024-03-24
雨時々止む

こうやってPythonファイルの中で欲しい値を取り出し、HTMLファイルに値を渡して表示させるという作戦です。

3. FORMから入力されたIDを利用する

次に必要な要素として、どこの天気予報を取得したいのかをWebブラウザのフォームで入力受付し、入力されたIDを利用してAPIを取得するという動きに繋げる必要があります。

要件としては、以下2点。

  • 都道府県・都市名・IDの一覧と、IDを入力するためのフォーム

  • 入力されたIDをPythonファイル側で取得し、該当の都市の天気情報をAPIで取得する

(1) 都道府県・都市名・IDの一覧と入力フォーム

一覧はテーブルで用意しました。(❶)多少なりとも見栄えを気にしてBootstrapを利用してますが、初めはそんなもの気にしなくていいと思います。

下の方にフォームを用意しpostメソッドを利用、formactionは入力された値を送信する先を表しています。(❷)

IDはplace_idという変数名で取得できるように送信しています。(❸)

weather.html

ここから先は

6,247字

この記事が気に入ったらチップで応援してみませんか?