flaskでFormデータの受け渡し(deta.space編)

deta.space - flaskを利用してFormデータ

flaskでformデータの受け渡し

一つ前では、deta.spaceでflaskのhello worldをやりましたので、今度はformデータの受け渡しをやってみましょう。

formとは

HTMLのformタグでinputで受け取ったデータを、指定したurlに送信して、受け取ることができます。これができればアンケートや掲示板のデータ入力ができるようになります。

flaskでindex.htmlを利用する方法

今回は、複数のhtmlファイルとコントローラーのmain.py、そして環境設定ファイルが必要です。そこでフォルダーに階層が必要になります。まずは、前回と同じでMicroを作成してから、フォルダーを作成して行きます

新規Microを作成する
mkdir formtest
cd formtest
space new

フォルダーに以下のファイルを作成していきます
main.py
requirements.txt
SpaceFile
\templates
     index.html 
     calc.html

index.html

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>formTest</title>
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    </head>
    <body>
        <div class="container">
            <h1 class="display-1 text-primary">べき乗の計算</h1>
            <div class="m-5 border p-3">
                <p>pythonでべき乗の計算をします。整数を2つ入力してください。</p>
                <form action="/calc" method="post">
                    <div class="mb-3 row p-3">
                        <div class="col-sm-4">
                            <input type="text" name="num1" size="20" maxlength="200">の
                        </div>
                        <div class="col-sm-4">
                            <input type="text" name="num2" size="20" maxlength="200">べき乗
                        </div>
                    </div>
                    <div class="mb-3 row p-3">
                        <div class="col-sm-10">
                            <input class="btn btn-primary" type="submit" value="計算">
                        </div>
                    </div>
                </form>
            </div>
            <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js" integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF" crossorigin="anonymous"></script>
        </div>
    </body>
</html>

Bootstrap5を使用しています。formの中でinputを2つ行い、num1とnum2を calc.htmlに送っています。

calc.html

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>formTest 結果表示</title>
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    </head>
    <body>
        <div class="container">
            <h1 class="display-1 text-primary">べき乗の計算</h1>
            <div class="m-5 border p-3">
                <p>pythonでべき乗の結果です。</p>
                <dl>
                    <!-- もとの数 -->
                    {{a}}**{{b}}={{c}}
                </dl>
            </div>
            <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js" integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF" crossorigin="anonymous"></script>
        </div>
    </body>
</html>

ここでは {a}と{b}と{c}という変数が宣言されていて、python経由でnum1とnum2と計算結果が送られてきます。それをrenderして表示します。

コントローラのpythonを記述します

main.pyにpythonのプログラムを記述します。flaskを使ってformのデータ渡しを行います。

main.py

from flask import Flask, render_template
from flask import request
import signal
import sys

app = Flask(__name__)

@app.route("/")
def hello():
	return render_template('index.html')

@app.route("/calc",methods=['POST'])
def connect():
	print("calc called")
	num1 = int(request.form['num1'])
	num2 = int(request.form['num2'])
	powered=0
	try:
		powered = num1 ** num2
		print("data:",num1,num2,powered)
	except:
		pass
	return render_template('calc.html', a=num1,b=num2,c=powered)

def sigint_handler(signal,frame):
	sys.exit(0)

if __name__ == '__main__':
	signal.signal(signal.SIGINT, sigint_handler)
	app.run(host='0.0.0.0', port=5000, debug=True)

つづいて、実行時に必要なライブラリー環境を宣言します。今回もflaskを使うのでそれを宣言します。

requirements.txt

flask

このファイルのスペルをよく間違えるので、確認してください。

SpaceFile

# Spacefile Docs: https://go.deta.dev/docs/spacefile/v0
v: 0
micros:
	- name: formtest
	src: ./
	engine: python3.9
	primary: true
	public: true

projectをデプロイします

space push

これでデプロイ終了です。実行するにはcanvasに作成されたアイコンを選択してください。

formtestで実験できます