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で実験できます