Flaskを使ってみる

requestライブラリで他のサーバーと連携する

FlaskはWEBサーバーを構築するためのFrameworkですが、requestライブラリを組み込むことでHTTPクライアントとしても 動きま す。
HTTPクライアントとして動けば、他のサーバーにデータを要求し、その結果を表示することができます。
こちらに 全国の天気予報がJSONフォーマットとして公開されています。→残念ながら2020年7月31日でサービスを終了してしまいました。


事前にrequestsライブラリをインストールしておきます。
$ python -m pip install request

pytonコードは以下の通りです。
request.get(url)でurlからJSONデータを読み込んでいます。

FlaskにもPOSTデータを読み込むためのrequestオブジェクトが有りますが、
これはフォームからのデータを受け取るためのオブジェクトで、
外部からのデータを受け取ることはできません。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask, render_template, redirect

# third-party HTTP client library
# sudo pip install requests
import requests
import json
app = Flask(__name__)

@app.route("/")
def index():
    url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=400040"
    Uresponse = requests.get(url)
    print("Uresponse={}".format(Uresponse))
    Jresponse = Uresponse.text
    #print("Jresponse={}".format(Jresponse))
    data = json.loads(Jresponse)
    print("data={}".format(data))
    #print(json.dumps(data, indent=2))
    print()
    print()
    print(data['location'])
    print(data['location']['city'])
    city=data['location']['city']
    print(data['location']['prefecture'])
    prefecture=data['location']['prefecture']
    print(data['location']['area'])
    area=data['location']['area']
    print(data['publicTime'])
    publicTime=data['publicTime']
    dateTime=publicTime.split('T')
    print("dateTime={}".format(dateTime))
    date=dateTime[0]
    time=dateTime[1]
    time=time.split('+')
    print("time={}".format(time))
    print(data['description']['text'])
    text=data['description']['text']

    templateData = {
       'city' : city,
       'prefecture' : prefecture,
       'area' : area,
       'name' : text,
       'ampm' : 1,
       'date': date,
       'time': time[0]
       }
    #./templates/sample.html
    return render_template('weather.html', **templateData)

if __name__ == "__main__":
    print("app.url_map={}".format(app.url_map))
    app.run(host='0.0.0.0', port=8080, debug=True)

template(weather.html)は以下の通り簡単なものです。
<!DOCTYPE html>
   <head>
      <title>今日のお天気</title>
      <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='style.css') }}"/>
   </head>

   <body>
      <h1>{{ area }} {{ prefecture }} {{ city }}</h1>
      <h2>{{ date }} {{ time }}</h2>
      {{ name }}
   </body>
</html>



feedparserライブラリを組み込むと、RSSで公開されているXMLデータを簡単に扱うことができます。
以下はYAHOO天気・災害のRSSフィードで公開されている全国の週間天気予報を表示したものです。
livedoorのWeather Hacksが2020年7月31日で終了してしまったので、今では貴重なサイトです。


pytonコードは以下の通りです。
事前にpipを使ってfeedparserライブラリを組み込んでいます。
feedparser.parse(url)でurlからXMLデータを読み込んでいます。
なお、feedparserライブラリはpython2の環境では動きません。
python3の環境が必要です。

スクリプト内のurlは、お住まいの地域に合わせて変更してください。
こちらのページで地域を選ぶ と表示されるURLをそのまま指定します。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask, render_template, redirect

import feedparser

# pip install feedparser
app = Flask(__name__)

@app.route("/")
def index():
    url = "https://rss-weather.yahoo.co.jp/rss/days/5110.xml"
    #dictionary = feedparser.parse(url)
    #print("dictionary={}".format(dictionary))
    itemsList = []
    for entry in feedparser.parse(url).entries:
        print(entry.title)
        itemsList.append(entry.title)

    return render_template('weather-yahoo.html', itemsList=itemsList)

if __name__ == "__main__":
    print("Reloding...")
    print("app.url_map={}".format(app.url_map))
    app.run(host='0.0.0.0', port=8080, debug=True)

template(weathery-yahoo.html)は以下の通り簡単なものです。
<!DOCTYPE html>
    <head>
        <title>今日のお天気</title>
        <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='style.css') }}"/>
    </head>

    <body>
        {% for item in itemsList %}
            {{ item }}
            <br>
        {% endfor %}
    </body>
</html>

続く...