GAミント至上主義

安くて速いが好きなWEBアプリ開発者。最近はPython, Vue.js, Firebase, GKE。@株式会社ビズオーシャン

Google Cloud FunctionsにPython3.7が追加されてる件

今日Cloud FunctionsってNodeのバージョン選べるっけと思ってみたら、Python3.7があることに気づく。

f:id:uyamazak:20180720184424p:plain

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を使うのもありかも。

さっそく、この前作ったRSSJSONにするやつをPythonで作ってみて速さなどを確認したいと思う。

uyamazak.hatenablog.com

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