Flask

参考文献

適当なアプリケーション

Pipfile

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
flask = "*"

[requires]
python_version = "3.9"

app.py

from urllib.parse import quote
from flask import Flask, render_template, request


class Info:
    """
    指定されたパラメータと結果を管理するクラス
    """
    def __init__(self, host):
        self.country_name = '日本'
        self.result = None
        self.host = host

    def set_sharing_url(self):
        self.sharing_url = self.host + '/?country_name=' + quote(self.country_name)

    def update(self, d):
        # 指定されたパラメータを吸い上げる
        self.__dict__.update(d)

        # 指定されたパラメータを処理して結果をセットする
        if self.country_name == '日本':
            self.result = '日本の首都は東京です。'
        elif self.country_name == 'アメリカ':
            self.result = 'アメリカの首都はワシントンDCです。'
        else:
            self.result = 'その国の首都はわかりません。'

        # 共有用にパラメータをプリセットしたURLをセットする
        self.set_sharing_url()


app = Flask(__name__)


@app.route(f'/', methods=['GET'])
@app.route(f'/post', methods=['GET', 'POST'])
def index():
    info = Info('http://' + request.host)

    # GET ならパスパラメータからパラメータを取得して処理
    if request.method == 'GET':
        info.update(request.args)

    # POST ならフォームからパラメータを取得して処理
    if request.method == 'POST':
        info.update(request.form)

    return render_template('index.html', info=info)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=False)

templates/layout.html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>demo</title>
    <style>
      body {
        background: aliceblue;
        padding: 20px;
        letter-spacing: 0.05em;
        line-height: 1.4;
      }
    </style>
  </head>
  <body>{% block content %}{% endblock %}</body>
</html>

templates/index.html

{% extends "layout.html" %}
{% block content %}

<h1>デモツール</h1>

<form action="/post" method="POST">
  国名: <input name="country_name" value="{{ info.country_name }}"/><br/>
  <button type="submit" name="action">OK</button><br/>
  {% if info.result %}
    {{ info.result }}<br/>
    <a href="{{ info.sharing_url }}">この結果へのURL</a>
  {% endif %}
</form>

{% endblock %}