Flaskを使ってみる

HTTPクライアントの実装

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


そこで、こ ちらのページからWEBデータを取り出して表示します。
事前にrequestsライブラリをインストールしておきます。
$ python3 -m pip install requests

pythonコードは以下の通りです。
requests.get(url)でurlからHTMLを読み込んで、そのまま表示しています。
FlaskにもPOSTデータを読み込むためのrequestオブジェクトが有りますが、
これはフォームからのデータを受け取るためのオブジェクトで、クライアントの機能は有りません。
requestsオブジェクトとrequestオブジェクトなので、とても紛らわしいです。
このコードを実行すると、こちらと 全く同じページが表示されるので、アンカーでジャンプしているように見えますが、
Flaskサーバーが別のサーバーからデータを取り込んで表示し ています。
# -*- 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 = "https://tenki.jp/forecast/5/26/5110/23104/10days.html"
    Uresponse = requests.get(url)
    print("Uresponse={}".format(Uresponse))
    return Uresponse.text

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

requestライブラリは、HTTPクライアント機能を提供するライブラリなので、GETだけでなく、POST/PUT/DELETEなども発 行することができます。
Flaskで作ったHTTPサーバーがRESTクライアントにもなるので、サーバー間の双方向通信ができるようになります。
POSTやPUTのやりかたはこ ちらに詳しく記載されています。



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


事前にpipを使ってfeedparserライブラリを組み込んでおきます。
$ python3 -m pip install feedparser

pytonコードは以下の通りです。
feedparser.parse(url)でurlからXMLデータを解析してリストに追加します。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask, render_template, redirect

import feedparser

# python3 -m 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>

続く...