「Pythonで作ったスクリプトを、社内の同僚にも使ってもらいたい」
そう思って調べたら、StreamlitかFlaskか、どっちを使えばいいのかわからなくなって止まっている…。
そんな状況になっていませんか。
私は製造業(フィルムパッケージ)の生産管理を7年担当しながら、Python独学でWebアプリを作り始めました。最初の壁が「Streamlitで作ったけど、もう少し自由にUIを作りたい」というものでした。その延長でFlaskに移行し、今では品質検査の記録フォームや在庫確認画面を社内LANで運用しています。
この記事では、その経験をもとに「FlaskでどんなときにどうやってWebツールを作るか」を、コピペして動くコードつきで解説します。
読み終わると、今日中に最初のFlask画面を動かすための流れが全部わかります。
Flaskを社内ツールに使うべきケース|StreamlitではなくFlaskを選ぶ理由
まず一番多い疑問から片づけます。「StreamlitとFlaskどっちを使えばいい?」これは多くの人が迷うポイントです。
StreamlitとFlaskの使い分け早見表
| 比較軸 | Streamlit | Flask |
|---|---|---|
| コード量 | 少ない(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を塞いでいる可能性があります。
設定手順:
- スタートメニューで「Windowsファイアウォール」を検索して開く
- 「詳細設定」→「受信の規則」→「新しい規則」
- 「ポート」→TCP→特定のポート欄に「5000」と入力
- 「接続を許可する」を選択して完了
会社のPCはITポリシーでファイアウォール変更が制限されているケースがあります。その場合は次のセクションで対処法を説明します。
よくある落とし穴とトラブル対処
他のPCからつながらない場合
多くの場合、原因はこのどれかです。
- ファイアウォールがポート5000を塞いでいる(前述の設定で解決)
- IPアドレスが間違っている(
ipconfigで再確認) - 自分のPCとアクセスしようとするPCが別のネットワーク(有線/無線)に繋がっている
- app.pyに
host='0.0.0.0'を書き忘れている
PC再起動後にサーバーが止まってしまう問題
Flaskの開発用サーバーは、ターミナルを閉じたりPCを再起動すると止まります。これが継続運用での最大の問題点です。
解決策は3つあります:
- Windowsのタスクスケジューラで起動を自動化する:PCのログイン時に自動でFlaskを起動するよう設定できます(手順はNote記事で公開予定)
- 社内サーバーやNASに移行する:24時間常時運用が必要な場合は本格的なサーバーが必要です
- 使う日だけ手動で起動する:週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で社内ツールを作る流れをまとめます。
- StreamlitかFlaskか迷ったら:複数人・フォーム・データ保存ならFlask
- FlaskをインストールするのはホストPCだけ:使う側はブラウザのみ
- ステップ1:
pip install flaskしてHello Worldを表示 - ステップ2:
request.form.get()でフォームデータを受け取り、CSVに保存 - ステップ3:
host='0.0.0.0'を追加してIPアドレスを共有するだけでLAN公開
「Webアプリは難しそう」というイメージがあるかもしれませんが、社内LAN限定のシンプルなツールなら、今日中に動くものが作れます。
最初は「品質記録フォーム1つ」から始めて、使われているのを確認してから機能を増やすのが一番得策です。
在庫管理フォーム・日報入力・品質記録のコード付きテンプレ集(品質チェックフォームの応用版、ファイルコピーだけで使える設計)をNoteで公開予定です。公開したらこちらにリンクします。
関連記事
- → 社内の非エンジニアにPythonツールを展開する方法(exe/Streamlit/bat配布との比較)
- → Streamlitで業務アプリを作る方法(もっとシンプルに作りたい場合)