今日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
}
]
}