Search by

    Google Clould Funtionsでflask-WTFが使えず悲しかった話

    なんで?

    経緯


    先日シンプルなhtmlで作成されたサイトにフォームをつけたいなという話になった。 既存のリソースに追加する形にしたいと思って調べていたら、GCPのcloud functionsが良さそうじゃないと思いついた。

    既存のHTMLにcloudfunctionで作ったフォームをiframeタグで埋め込めば良いのでは。

    因みにcloud functionsのここが好き
    • お手軽。既存のリソースに追加できる。python使える。
    • DBいらず。使った時だけ課金。安い。

    デプロイする


    ロカールでサンプルのフォームを書いて動作を確認、よーしデプロイしてみよって思ったら何故か動かない。

    デバッグする


    stackdriverでエラーを見る

      File "/user_code/main.py", line 31, in index
        form = MyForm()
      File "/env/local/lib/python3.7/site-packages/wtforms/form.py", line 212, in __call__
        return type.__call__(cls, *args, **kwargs)
      File "/env/local/lib/python3.7/site-packages/flask_wtf/form.py", line 88, in __init__
        super(FlaskForm, self).__init__(formdata=formdata, **kwargs)
      File "/env/local/lib/python3.7/site-packages/wtforms/form.py", line 278, in __init__
        self.process(formdata, obj, data=data, **kwargs)
      File "/env/local/lib/python3.7/site-packages/wtforms/form.py", line 132, in process
        field.process(formdata)
      File "/env/local/lib/python3.7/site-packages/wtforms/csrf/core.py", line 43, in process
        self.current_token = self.csrf_impl.generate_csrf_token(self)
      File "/env/local/lib/python3.7/site-packages/flask_wtf/csrf.py", line 134, in generate_csrf_token
        token_key=self.meta.csrf_field_name
      File "/env/local/lib/python3.7/site-packages/flask_wtf/csrf.py", line 35, in generate_csrf
        message='A secret key is required to use CSRF.'
      File "/env/local/lib/python3.7/site-packages/flask_wtf/csrf.py", line 121, in _get_config
        raise KeyError(message)
    KeyError: 'A secret key is required to use CSRF.'
    "
    KeyError: 'A secret key is required to use CSRF.'

    「うん。秘密鍵がなくてwtformsを作れねぇんだってばよ」

    調べるとstack overflowに解決策が。 「なーんだ、あれ、でもローカルで動いていたんだけどなぁ」

    下記のcodeが記述されていることを確認。

    main.py
    app.config["SECRET_KEY"] = "secret key"

    「…設定しているじゃん。…なんで動かないんだってばよ。」

    思い悩む。

    (数時間後)

    「わがらない、僕にはどうしたってわがらねぇ。」

    Cloud funtionsのでのpythonの実行環境


    結局今回は解決できず。パッケージの依存とか、バージョンの問題かと思い、色々ためしたが動かない。なんでだろう。

    Cloud funtionsでは特定のパッケージ(今回はflask-WTF)が正しく動かない ことがあるみたい。 自分のコードに何かが抜けているのかもしれない。(その確率の方が高い)

    気を取り直して、無価値なブログ投稿、失敗供養。そのうち何か閃く、かもしれない。