Pythonの軽量Webフレームワーク「Flask」を使用して、エックスサーバー上で動作する名簿管理アプリを構築します。このアプリは、名簿データのCRUD(作成、読み取り、更新、削除)操作を行うシンプルなアプリケーションです。
構築するアプリケーションの概要
このアプリケーションは以下の機能を提供します:
- 名簿の新規作成
名前、メールアドレス、電話番号を登録します。 - 名簿一覧の表示
登録された名簿データを表形式で表示します。 - 名簿の編集
登録済みのデータを編集できます。 - 名簿の削除
不要なデータを削除できます。
ファイル構成
以下の構成でファイルを準備します:
.
├── public_html/ # ドキュメントルート
│ ├── index.cgi # Flaskアプリを実行するCGIスクリプト
│ ├── main.py # Flaskアプリ本体
│ ├── templates/ # HTMLテンプレート
│ │ ├── base.html # 共通レイアウト
│ │ ├── index.html # 名簿一覧表示
│ │ ├── create.html # 名簿新規作成
│ │ └── edit.html # 名簿編集
│ └── .htaccess # Apache設定ファイル
Miniconda環境の構築
Minicondaのインストール
エックスサーバーにMinicondaをインストールしてPython環境を構築します。手順の詳細は、以下の記事を参照してください:
Flask環境の準備
Flask用の環境を構築し、必要なパッケージをインストールします。
conda create -n flask_env python=3.10 -y
conda activate flask_env
pip install flask flask-sqlalchemy
アプリケーションの実装
1. Flaskアプリ本体 (main.py)
以下のコードを public_html/main.py
に保存します。
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///members.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class Member(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
email = db.Column(db.String(100), nullable=False)
phone = db.Column(db.String(20), nullable=True)
with app.app_context():
db.create_all()
@app.route('/')
def index():
members = Member.query.all()
return render_template('index.html', members=members)
@app.route('/create', methods=['GET', 'POST'])
def create():
if request.method == 'POST':
name = request.form['name']
email = request.form['email']
phone = request.form.get('phone')
new_member = Member(name=name, email=email, phone=phone)
db.session.add(new_member)
db.session.commit()
return redirect(url_for('index'))
return render_template('create.html')
@app.route('/edit/<int:id>', methods=['GET', 'POST'])
def edit(id):
member = Member.query.get_or_404(id)
if request.method == 'POST':
member.name = request.form['name']
member.email = request.form['email']
member.phone = request.form.get('phone')
db.session.commit()
return redirect(url_for('index'))
return render_template('edit.html', member=member)
@app.route('/delete/<int:id>')
def delete(id):
member = Member.query.get_or_404(id)
db.session.delete(member)
db.session.commit()
return redirect(url_for('index'))
2. CGIスクリプト (index.cgi)
以下のコードを public_html/index.cgi
に保存します。
#!/home/ユーザー名/miniconda3/envs/flask_env/bin/python
from main import app
import os
# CGI ハンドラー
def cgi_handler():
environ = os.environ
environ['SCRIPT_NAME'] = '/'
environ['REQUEST_URI'] = environ.get('REQUEST_URI', '/')
from wsgiref.handlers import CGIHandler
CGIHandler().run(app)
if __name__ == '__main__':
cgi_handler()
3. Apache設定ファイル (.htaccess)
以下の内容を public_html/.htaccess
に保存します。
Options +ExecCGI
AddHandler cgi-script .cgi
DirectoryIndex index.cgi
# すべてのリクエストを index.cgi に渡す
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.cgi/$1 [QSA,L]
4. HTMLテンプレート
以下のテンプレートファイルを public_html/templates/
に保存します。
名簿一覧表示 (index.html)
{% extends 'base.html' %}
{% block title %}名簿一覧{% endblock %}
{% block content %}
<h2>名簿一覧</h2>
<table border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<th>ID</th>
<th>名前</th>
<th>メールアドレス</th>
<th>電話番号</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for member in members %}
<tr>
<td>{{ member.id }}</td>
<td>{{ member.name }}</td>
<td>{{ member.email }}</td>
<td>{{ member.phone or '---' }}</td>
<td>
<a href="/edit/{{ member.id }}">編集</a>
<a href="/delete/{{ member.id }}" onclick="return confirm('本当に削除しますか?')">削除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% if members|length == 0 %}
<p>登録された名簿がありません。</p>
{% endif %}
{% endblock %}
名簿新規作成 (create.html)
{% extends 'base.html' %}
{% block title %}名簿新規作成{% endblock %}
{% block content %}
<h2>名簿新規作成</h2>
<form method="post">
<label for="name">名前:</label><br>
<input type="text" id="name" name="name" required><br><br>
<label for="email">メールアドレス:</label><br>
<input type="email" id="email" name="email" required><br><br>
<label for="phone">電話番号:</label><br>
<input type="text" id="phone" name="phone"><br><br>
<button type="submit">登録</button>
</form>
{% endblock %}
名簿編集 (edit.html)
{% extends 'base.html' %}
{% block title %}名簿編集{% endblock %}
{% block content %}
<h2>名簿編集</h2>
<form method="post">
<label for="name">名前:</label><br>
<input type="text" id="name" name="name" value="{{ member.name }}" required><br><br>
<label for="email">メールアドレス:</label><br>
<input type="email" id="email" name="email" value="{{ member.email }}" required><br><br>
<label for="phone">電話番号:</label><br>
<input type="text" id="phone" name="phone" value="{{ member.phone }}"><br><br>
<button type="submit">更新</button>
</form>
{% endblock %}
動作確認
- ファイルの配置
- 上記のファイルをすべて
public_html/
にアップロードします。
- 権限の設定
index.cgi
に実行権限を付与します:chmod +x public_html/index.cgi
- ブラウザで確認
- ブラウザで
http://your-domain.com/
にアクセスし、アプリケーションが正しく動作することを確認します。 - 名簿一覧画面が表示され、CRUD(作成、読み取り、更新、削除)の操作が正常に動作するか確認してください。
よくあるトラブルと解決方法
- 「500 Internal Server Error」が表示される場合:
index.cgi
に実行権限がない可能性があります。次のコマンドで確認・修正してください:chmod +x public_html/index.cgi
- Pythonのインストールパスが正しいか、スクリプトの1行目(
#!/home/ユーザー名/miniconda3/envs/flask_env/bin/python
)を確認してください。
- データが保存されない場合:
members.db
ファイルに書き込み権限がない可能性があります。次のコマンドで権限を設定してください:chmod 666 public_html/members.db
- ページが見つからない場合:
.htaccess
の設定が正しくない可能性があります。特にRewriteRule
部分を確認してください。
発展的なカスタマイズ
- 検索機能の追加
- 名簿データを名前やメールアドレスで検索できる機能を追加できます。
- ページネーション
- 名簿データが多くなる場合に備えて、ページネーション機能を導入することをおすすめします。
- デザインの改善
- CSSフレームワーク(例: Tailwind CSS, Bootstrap)を使用してUIを向上させることで、アプリケーションをより見やすくできます。
まとめ
この記事では、エックスサーバー上でFlaskをCGIスクリプトとして動作させる方法を解説しました。この構成で名簿管理アプリが動作することを確認したら、次のステップとして機能拡張やUIの改善に取り組んでみてください。
Python環境構築に関して詳しく知りたい方は、Minicondaを使ったPython環境構築手順 をご覧ください。
コメント