今日Cloud FunctionsってNodeのバージョン選べるっけと思ってみたら、Python3.7があることに気づく。
package.jsonの代わりにrequirements.txtがありpipのパッケージを指定できるっぽい。
Nodeは6系と古いままのにPythonは6月ごろに出たばっかの最新の3.7とこの扱いの差はなんなんだろう。Googleの中の人のご要望だろうか。
HTTPトリガーのサンプルコードは下記のようになっていた。
使ったことないけどflaskをでラップしてくれてる感じか。
def hello_world(request): """Responds to any HTTP request. Args: request (flask.Request): HTTP request object. Returns: The response text or any set of values that can be turned into a Response object using `make_response <http://flask.pocoo.org/docs/0.12/api/#flask.Flask.make_response>`. """ request_json = request.get_json() if request.args and 'message' in request.args: return request.args.get('message') elif request_json and 'message' in request_json: return request_json['message'] else: return f'Hello World!'
Nodeのバージョン古いなぁと悩むぐらいならPythonを使うのもありかも。
さっそく、この前作ったRSSをJSONにするやつをPythonで作ってみて速さなどを確認したいと思う。
2018/7/23 追記
とりいそぎPython版作った。CORSはちょうどいいのがなかったのでシンプルに手書きした。
レスポンスはNode版とほぼ差がない感じなので、このまま使ってみようと思う。
import feedparser import json RSS_URL = "https://blog.yagish.jp/rss" WHITELIST = ['http://192.168.2.70:2105', 'http://ml30gen9.jp:2105', 'https://rirekisho.yagish.jp'] MAX_ENTRIES_NUM = 3 def rss2json(request): headers = {} origins = [val for key, val in request.headers if key == 'Origin'] if len(origins) > 0: origin = origins[0] for allowed_url in WHITELIST: if origin == allowed_url: headers['Access-Control-Allow-Origin'] = allowed_url break headers["Content-Type"] = "application/json; charset=utf-8" headers["Cache-Control"] = "public, max-age=30, s-maxage=60" rss = {} try: raw_rss = feedparser.parse(RSS_URL) rss['feed'] = raw_rss['feed'] rss['entries'] = raw_rss['entries'][:MAX_ENTRIES_NUM] except Exception(e): return (e, 500) else: return (json.dumps(rss, indent=2, ensure_ascii=False), headers)
レスポンスは下記のような感じ。一部省略
{ "feed": { "title": "yagishのブログ", "title_detail": { "type": "text/plain", "language": null, "base": "https://blog.yagish.jp/rss", "value": "yagishのブログ" }, "links": [ { "rel": "alternate", "type": "text/html", "href": "https://blog.yagish.jp/" } ], "link": "https://blog.yagish.jp/", "subtitle": "ブラウザでつくれる履歴書 yagish( https://rirekisho.yagish.jp )のお知らせブログです", "subtitle_detail": { "type": "text/html", "language": null, "base": "https://blog.yagish.jp/rss", "value": "ブラウザでつくれる履歴書 yagish( https://rirekisho.yagish.jp )のお知らせブログです" }, "updated": "Wed, 18 Jul 2018 18:36:13 +0900", "updated_parsed": [ 2018, 7, 18, 9, 36, 13, 2, 199, 0 ], "docs": "http://blogs.law.harvard.edu/tech/rss", "generator_detail": { "name": "Hatena::Blog" }, "generator": "Hatena::Blog" }, "entries": [ { "title": "バックアッププレビューなどアップデートのお知らせ", "title_detail": { "type": "text/plain", "language": null, "base": "https://blog.yagish.jp/rss", "value": "バックアッププレビューなどアップデートのお知らせ" }, "links": [ { "rel": "alternate", "type": "text/html", "href": "https://blog.yagish.jp/entry/2018/07/18/183613?utm_source=feed" }, { "type": "image/png", "length": "0", "href": "https://cdn.blog.st-hatena.com/images/theme/og-image-1500.png", "rel": "enclosure" } ], "link": "https://blog.yagish.jp/entry/2018/07/18/183613?utm_source=feed", "summary": "<p>次回のアップデートで以下の機能を追加・変更予定です。日程は追ってご連絡します。</p>", "summary_detail": { "type": "text/html", "language": null, "base": "https://blog.yagish.jp/rss", "value": "<p>次回のアップデートで以下の機能を追加・変更予定です。日程は追ってご連絡します。</p>" }, "published": "Wed, 18 Jul 2018 18:36:13 +0900", "published_parsed": [ 2018, 7, 18, 9, 36, 13, 2, 199, 0 ], "id": "hatenablog://entry/10257846132602357979", "guidislink": false } ] }