
ChatGPT o1使ってFlaskを勉強してみる
最近AIエージェントにプログラムを書いてもらってたら何でも書いてくれるので勉強がてら知らないことに挑戦してみる。
実はsakuraレンタルサーバーを2007年くらいから借りてるけど何にも使ってない(昔はPHPやRubyを動かして遊んでましたが)と思ったのでPythonの勉強を兼ねてWEBアプリに挑戦してみようと思った。
で色々やってsakuraレンタルサーバーにFlaskをインストールしてChatGPT o1にプログラムを書いてもらった。
Q.「FlaskをつかったTODOアプリを作ってください。sakuraレンタルサーバーに設置します。ファイルはapp.cgi,app.pyとテンプレートのindex.htmlおよびSQLITEのデータベースのみとします。データベースは存在しない場合、自動生成してください。」
こう頼むとapp.cgi,app.pyとtemplares/index.htmlを以下のように生成してくれた。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os
# 現在のディレクトリをパスに追加
sys.path.insert(0, os.path.dirname(__file__))
from wsgiref.handlers import CGIHandler
from app import app # app.pyで定義したFlaskアプリをインポート
def main():
CGIHandler().run(app)
if __name__ == '__main__':
main()
# -*- coding: utf-8 -*-
import os
import sqlite3
from flask import Flask, request, redirect, url_for, render_template
app = Flask(__name__)
DATABASE = 'todo.db'
def init_db():
"""データベースが存在しない場合に新規作成する."""
if not os.path.exists(DATABASE):
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
c.execute('''
CREATE TABLE tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
content TEXT NOT NULL
)
''')
conn.commit()
conn.close()
# アプリ起動時にDB初期化をチェック
init_db()
@app.route('/')
def index():
"""タスク一覧を表示"""
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
c.execute('SELECT id, content FROM tasks ORDER BY id DESC')
tasks = c.fetchall()
conn.close()
return render_template('index.html', tasks=tasks)
@app.route('/add', methods=['POST'])
def add():
"""新規タスクを追加"""
content = request.form.get('content', '').strip()
if content:
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
c.execute('INSERT INTO tasks (content) VALUES (?)', (content,))
conn.commit()
conn.close()
return redirect(url_for('index'))
@app.route('/delete/<int:task_id>', methods=['POST'])
def delete(task_id):
"""タスクを削除"""
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
c.execute('DELETE FROM tasks WHERE id=?', (task_id,))
conn.commit()
conn.close()
return redirect(url_for('index'))
if __name__ == '__main__':
# ローカル実行する場合のみ有効
# sakuraレンタルサーバーのCGIではapp.cgi側から起動されるため、
# こちらはデバッグ用などで使用してください
app.run(debug=True)
templates/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>TODOアプリ</title>
</head>
<body>
<h1>TODOリスト</h1>
<form action="{{ url_for('add') }}" method="post">
<input type="text" name="content" placeholder="新しいタスクを入力">
<button type="submit">追加</button>
</form>
<ul>
{% for task in tasks %}
<li>
{{ task[1] }}
<form action="{{ url_for('delete', task_id=task[0]) }}" method="post" style="display:inline;">
<button type="submit">削除</button>
</form>
</li>
{% endfor %}
</ul>
</body>
</html>
後はapp.cgiにchmodで実行権限付けたらちゃんと動きました。
ChatGPT o1使って色々組んだから回数制限表示が出ました。
