Flask 社内ツール 作り方|品質フォーム→LAN公開まで非エンジニアが実践解説

「Pythonで作ったスクリプトを、社内の同僚にも使ってもらいたい」
そう思って調べたら、StreamlitかFlaskか、どっちを使えばいいのかわからなくなって止まっている…。

そんな状況になっていませんか。

私は製造業(フィルムパッケージ)の生産管理を7年担当しながら、Python独学でWebアプリを作り始めました。最初の壁が「Streamlitで作ったけど、もう少し自由にUIを作りたい」というものでした。その延長でFlaskに移行し、今では品質検査の記録フォームや在庫確認画面を社内LANで運用しています。

この記事では、その経験をもとに「FlaskでどんなときにどうやってWebツールを作るか」を、コピペして動くコードつきで解説します。

読み終わると、今日中に最初のFlask画面を動かすための流れが全部わかります。

Flaskを社内ツールに使うべきケース|StreamlitではなくFlaskを選ぶ理由

まず一番多い疑問から片づけます。「StreamlitとFlaskどっちを使えばいい?」これは多くの人が迷うポイントです。

StreamlitとFlaskの使い分け早見表

比較軸StreamlitFlask
コード量少ない(UIはStreamlitが自動生成)多め(HTMLを自分で書く)
UIの自由度低い(決まったコンポーネント)高い(CSS・デザイン自由)
複数人同時利用△(状態管理が複雑)◎(設計次第でスムーズ)
データ保存△(ファイルやCSV中心)◎(DB連携も容易)
社内LAN公開◎(簡単)◎(設定1行で可能)
習得コスト低い中程度

こんな場合はFlask一択

  • 複数人が同時に入力フォームを使う
  • 入力データをCSVやDBに保存したい
  • 画面デザインを会社のフォーマットに合わせたい
  • 「送信」「確認画面」「完了画面」のような複数ページが必要

反対に、「自分一人がデータを可視化したい」「グラフを素早く作りたい」ならStreamlitの方が向いています。Pythonコードだけで完結するので、HTMLを書きたくない場合はStreamlitが一番得策です。

→ Streamlitで作る方法はこちらの記事で詳しく解説しています。

Flaskで社内ツールを作る前に確認すること

必要な環境(Python, pip)

前提として、自分のPC(ツールを動かすサーバー役のPC)に以下が入っていれば十分です。

  • Python 3.8以上
  • pip(Pythonと一緒にインストール済みのはず)
  • Flask(後でインストールします)

以下のコマンドで確認できます。

python --version
pip --version

社内PCにインストールが必要なのは自分のPCだけ

ここが重要なポイントです。FlaskをインストールするのはツールをホストするPCだけで、使う側の社員は何もインストールしなくていいのです。

使う側は、ブラウザで「192.168.1.10:5000」のようなURLにアクセスするだけ。ChromeでもEdgeでも動きます。これが、ExcelマクロやPythonスクリプトを配布するよりずっと楽な理由です。

ステップ1:Flaskをインストールして最初の画面を表示する

まずFlaskをインストールして、ブラウザに何かが表示されるところまで動かします。

pip install flask

コード例:Hello World(コピペOK)

以下を app.py という名前で保存してください。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>社内ツールへようこそ</h1>'

if __name__ == '__main__':
    app.run(debug=True)  # 開発時はdebug=True。LAN公開時はdebug=Falseに変更すること

実行方法:

python app.py

動作確認の方法

ターミナルに Running on http://127.0.0.1:5000 と表示されたら成功です。ブラウザで http://localhost:5000 を開くと「社内ツールへようこそ」と表示されるはずです。

この時点では自分のPCの中だけで動いています。他のPCからはまだ見えません。社内LANへの公開はステップ3でやります。

ステップ2:入力フォームを作る(品質チェック記録の実例)

「Hello World」から実用ツールへ。ここが一番大事なステップです。品質検査の記録を入力してCSVに保存するフォームを例に作ります。

私の現場では、品質検査の記録をExcelの共有ファイルに入力していたのですが、同時に複数人が開くと壊れることが何度かありました。Flaskに移行してから、その問題はなくなっています。

HTMLフォームとFlaskルーティングの仕組み

Flaskでフォームを作るには2つのファイルが必要です。「画面の見た目(HTML)」と「データ処理(Python)」を分けて書くのがFlaskの基本的な考え方です。

  • app.py:Pythonで処理を書く(フォームデータの受け取り・CSV保存)
  • templates/form.html:フォームの画面を書く(見た目だけ担当)

HTMLを templates フォルダに入れるのはFlaskの決まりです。このフォルダ名でないと読み込めません。

プロジェクトフォルダ/
├── app.py
└── templates/
    └── form.html

コード例:品質チェック入力フォーム(コピペOK)

templates/form.html(画面の見た目を書く)

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>品質チェック記録</title>
</head>
<body>
  <h1>品質チェック記録フォーム</h1>
  <form method="POST" action="/submit">
    <label>担当者名:<input type="text" name="operator"></label><br>
    <label>製品番号:<input type="text" name="product_id"></label><br>
    <label>検査結果:
      <select name="result">
        <option value="OK">OK</option>
        <option value="NG">NG</option>
      </select>
    </label><br>
    <label>備考:<input type="text" name="memo"></label><br>
    <button type="submit">記録する</button>
  </form>
  {% if message %}
    <p style="color:green">{{ message }}</p>
  {% endif %}
</body>
</html>

「operator」「product_id」などの name="〇〇" の部分が、次のPythonコードで受け取る項目名になります。自分の業務に合わせてここを変えるだけで、日報入力や在庫記録フォームに転用できます。

app.py(データ処理を書く)

from flask import Flask, render_template, request
import csv
import os
from datetime import datetime

app = Flask(__name__)

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

@app.route('/submit', methods=['POST'])
def submit():
    # フォームのデータを受け取る
    operator = request.form.get('operator')
    product_id = request.form.get('product_id')
    result = request.form.get('result')
    memo = request.form.get('memo')
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

    # CSVに追記保存
    csv_path = 'records.csv'
    file_exists = os.path.exists(csv_path)
    with open(csv_path, 'a', newline='', encoding='utf-8-sig') as f:
        writer = csv.writer(f)
        if not file_exists:
            writer.writerow(['日時', '担当者', '製品番号', '結果', '備考'])
        writer.writerow([timestamp, operator, product_id, result, memo])

    return render_template('form.html', message='記録しました')

if __name__ == '__main__':
    app.run(debug=False)  # debug=False:社内公開時はこの設定で使うこと

このコードを動かすと、フォームに入力して「記録する」を押すたびに、同じフォルダに records.csv が作られていきます。Excelで開けるフォーマットです。

コードで特に覚えておくべきは以下の2点です:

  • request.form.get('項目名') でフォームの入力値を受け取る
  • render_template('form.html') でHTMLファイルを表示する

製品番号や担当者のカラム名を変えれば、日報入力や在庫記録にもそのまま流用できます。

ステップ3:社内LANで他のPCからアクセスできるようにする

自分のPCで動いたら、次は同じネットワーク内の他の人にも使ってもらいましょう。設定は1か所だけです。

host=’0.0.0.0’の意味と設定方法

app.run() の部分を以下のように変えるだけです。

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

host='0.0.0.0' は「このPCの全てのネットワークからアクセスを受け付ける」という意味です。社内LANに繋がっているPCからアクセス可能になります。

自分のIPアドレスを確認して共有する

Windowsの場合、コマンドプロンプトで以下を実行します。

ipconfig

表示される「IPv4 アドレス」の値(例:192.168.1.15)が自分のPCのIPアドレスです。社内チャットでこう伝えるだけです。

「品質記録フォームをブラウザで開けるようにしました。http://192.168.1.15:5000 にアクセスしてください」

Windowsファイアウォールの設定(つながらない場合)

他のPCからアクセスできない場合、Windowsのファイアウォールがポート5000を塞いでいる可能性があります。

設定手順:

  1. スタートメニューで「Windowsファイアウォール」を検索して開く
  2. 「詳細設定」→「受信の規則」→「新しい規則」
  3. 「ポート」→TCP→特定のポート欄に「5000」と入力
  4. 「接続を許可する」を選択して完了

会社のPCはITポリシーでファイアウォール変更が制限されているケースがあります。その場合は次のセクションで対処法を説明します。

よくある落とし穴とトラブル対処

他のPCからつながらない場合

多くの場合、原因はこのどれかです。

  • ファイアウォールがポート5000を塞いでいる(前述の設定で解決)
  • IPアドレスが間違っている(ipconfigで再確認)
  • 自分のPCとアクセスしようとするPCが別のネットワーク(有線/無線)に繋がっている
  • app.pyに host='0.0.0.0' を書き忘れている

PC再起動後にサーバーが止まってしまう問題

Flaskの開発用サーバーは、ターミナルを閉じたりPCを再起動すると止まります。これが継続運用での最大の問題点です。

解決策は3つあります:

  1. Windowsのタスクスケジューラで起動を自動化する:PCのログイン時に自動でFlaskを起動するよう設定できます(手順はNote記事で公開予定)
  2. 社内サーバーやNASに移行する:24時間常時運用が必要な場合は本格的なサーバーが必要です
  3. 使う日だけ手動で起動する:週1〜2回使う程度なら、使う前に起動するルールで十分です

私の現場では当初「使う前に担当者が起動」から始めて、需要が確認できてから社内サーバーに移行しました。いきなり本格構築しなくても大丈夫なのです。

セキュリティ・IT部門への説明について

「勝手にWebサーバー立てて怒られないか…」という不安は、正直私もありました。

社内ツール利用でやってはいけないこと

  • 個人情報や機密情報を含むデータをインターネット公開のサーバーに置く
  • debug=True のまま社内公開する(デバッガーが外部から操作できる状態になる)
  • IT部門のポリシーを確認せずに社外からアクセス可能な状態にする

裏を返すと、社内LAN内のみで使い、機密情報を扱わず、debug=Falseで動かすなら、多くの場合問題ありません。

IT部門に相談するときのひと言テンプレ

先に相談しておくと後が楽です。こんな内容で一言入れておくと通りやすいです。

「社内LANのみで使う品質記録の入力ツールをPythonで作りました。インターネットには公開しません。ポート5000番を社内で使ってよいか確認させてください」

「インターネット非公開」「社内LAN限定」「ポート番号の明示」この3点を伝えると、多くのIT部門はすんなり許可してくれます。

Flaskから次のステップへ

本格サーバー運用(社内サーバー、VPS)への移行

個人PCでの運用に限界を感じたら(24時間稼働が必要、PC電源オフが不便など)、次のステップとして社内サーバーやVPSへの移行を検討します。

ただ、まずは「個人PCで動かして実際に使われるか確認する」フェーズを経てからの方が、IT部門の承認も取りやすくなります。需要の証明がある状態で相談できるからです。

データベース連携(SQLite)の入り口

CSVへの書き出しだけでは限界が来たとき(検索機能、履歴管理、ユーザー別アクセス)は、SQLiteとの連携が次の選択肢です。Pythonに最初から含まれているので追加インストール不要で使えます。

→ より本格的な社内ツールのWeb化の方法はこちらの記事も参考になります。

まとめ

Flaskで社内ツールを作る流れをまとめます。

  1. StreamlitかFlaskか迷ったら:複数人・フォーム・データ保存ならFlask
  2. FlaskをインストールするのはホストPCだけ:使う側はブラウザのみ
  3. ステップ1pip install flask してHello Worldを表示
  4. ステップ2request.form.get()でフォームデータを受け取り、CSVに保存
  5. ステップ3host='0.0.0.0'を追加してIPアドレスを共有するだけでLAN公開

「Webアプリは難しそう」というイメージがあるかもしれませんが、社内LAN限定のシンプルなツールなら、今日中に動くものが作れます。

最初は「品質記録フォーム1つ」から始めて、使われているのを確認してから機能を増やすのが一番得策です。


在庫管理フォーム・日報入力・品質記録のコード付きテンプレ集(品質チェックフォームの応用版、ファイルコピーだけで使える設計)をNoteで公開予定です。公開したらこちらにリンクします。

関連記事