見出し画像

Roo ClineにFlaskでブログ作ってもらった。

VS Codeに入れたRoo Clineで自動でアプリを作ってもらうのが面白くてPythonでFlaskを使ったWEBアプリの簡易ブログを作ってもらいました。
APIはDeepSeekを使ってます。

Roo Clineへ頼んだプロンプトは以下です。Win11でWSL2を使っています。

Q.「Flaskをつかったシンプルなブログシステムを作ってください。
フォルダは/home/garyo/project/flask/blogです。
機能: 記事の投稿、編集、削除、コメント機能
学べること: ORM、リレーショナルデータベースの使い方
主な技術: Flask-SQLAlchemy, Jinja2」

出来上がったのはこんな簡易ブログでタイトル、本文、コメントもつけれます。

app.py

from flask import Flask, render_template, redirect, url_for, request
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SubmitField
from wtforms.validators import DataRequired
from datetime import datetime

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=False)
    date_posted = db.Column(db.DateTime, default=datetime.utcnow)
    comments = db.relationship('Comment', backref='post', cascade='all, delete-orphan')

class Comment(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.Text, nullable=False)
    date_posted = db.Column(db.DateTime, default=datetime.utcnow)
    post_id = db.Column(db.Integer, db.ForeignKey('post.id'), nullable=False)

class PostForm(FlaskForm):
    title = StringField('タイトル', validators=[DataRequired()])
    content = TextAreaField('本文', validators=[DataRequired()])
    submit = SubmitField('投稿')

class CommentForm(FlaskForm):
    content = TextAreaField('コメント', validators=[DataRequired()])
    submit = SubmitField('コメントする')

@app.route('/')
def index():
    posts = Post.query.order_by(Post.date_posted.desc()).all()
    post_form = PostForm()
    comment_form = CommentForm()
    return render_template('index.html', 
                         posts=posts, 
                         post_form=post_form,
                         comment_form=comment_form)

@app.route('/post', methods=['POST'])
def create_post():
    form = PostForm()
    if form.validate_on_submit():
        post = Post(title=form.title.data, content=form.content.data)
        db.session.add(post)
        db.session.commit()
    return redirect(url_for('index'))

@app.route('/post/<int:id>/edit', methods=['GET', 'POST'])
def edit_post(id):
    post = Post.query.get_or_404(id)
    form = PostForm()
    if form.validate_on_submit():
        post.title = form.title.data
        post.content = form.content.data
        db.session.commit()
        return redirect(url_for('index'))
    elif request.method == 'GET':
        form.title.data = post.title
        form.content.data = post.content
    return render_template('edit_post.html', form=form)

@app.route('/post/<int:id>/delete')
def delete_post(id):
    post = Post.query.get_or_404(id)
    db.session.delete(post)
    db.session.commit()
    return redirect(url_for('index'))

@app.route('/post/<int:post_id>/comment', methods=['POST'])
def add_comment(post_id):
    form = CommentForm()
    if form.validate_on_submit():
        comment = Comment(content=form.content.data, post_id=post_id)
        db.session.add(comment)
        db.session.commit()
    return redirect(url_for('index'))

@ app.cli.command("init-db")
def init_db():
    with app.app_context():
        db.create_all()
    print("Database tables created successfully")

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    app.run(debug=True)

temlates/base.html

<!DOCTYPE html>
<html>
<head>
    <title>Flask Blog</title>
    <style>
        .container { max-width: 800px; margin: 0 auto; padding: 20px; }
        .post { border: 1px solid #ddd; padding: 20px; margin-bottom: 20px; }
        .comment { margin-left: 30px; padding: 10px; background: #f5f5f5; }
    </style>
</head>
<body>
    <div class="container">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

templates/index.html

{% extends "base.html" %}

{% block content %}
    <h1>新規投稿</h1>
    <form method="POST" action="{{ url_for('create_post') }}">
        {{ post_form.hidden_tag() }}
        <div>
            {{ post_form.title.label }}<br>
            {{ post_form.title(size=50) }}
        </div>
        <div>
            {{ post_form.content.label }}<br>
            {{ post_form.content(rows=4, cols=50) }}
        </div>
        <div>{{ post_form.submit() }}</div>
    </form>

    <h1>投稿一覧</h1>
    {% for post in posts %}
        <div class="post">
            <h2>{{ post.title }}</h2>
            <p>{{ post.content }}</p>
            <small>{{ post.date_posted.strftime('%Y-%m-%d %H:%M') }}</small>
            <a href="{{ url_for('edit_post', id=post.id) }}">編集</a>
            <a href="{{ url_for('delete_post', id=post.id) }}">削除</a>
            
            <h3>コメント</h3>
            <form method="POST" action="{{ url_for('add_comment', post_id=post.id) }}">
                {{ comment_form.hidden_tag() }}
                {{ comment_form.content(rows=2, cols=40) }}
                {{ comment_form.submit() }}
            </form>
            
            {% for comment in post.comments %}
                <div class="comment">
                    <p>{{ comment.content }}</p>
                    <small>{{ comment.date_posted.strftime('%Y-%m-%d %H:%M') }}</small>
                </div>
            {% endfor %}
        </div>
    {% endfor %}
{% endblock %}

templates/edit_post.html

{% extends "base.html" %}

{% block content %}
    <h1>記事編集</h1>
    <form method="POST">
        {{ form.hidden_tag() }}
        <div>
            {{ form.title.label }}<br>
            {{ form.title(size=50) }}
        </div>
        <div>
            {{ form.content.label }}<br>
            {{ form.content(rows=4, cols=50) }}
        </div>
        <div>{{ form.submit() }}</div>
    </form>
{% endblock %}

いいなと思ったら応援しよう!