flask
Flaskは、Pythonで手軽にWebアプリケーションを開発できるフレームワークで、Jinja2テンプレートやWerkzeugツールキットを利用し、データベースや認証など豊富な拡張機能を使って柔軟に機能を構築するSkill。
📜 元の英語説明(参考)
Flask is a lightweight Python micro web framework that provides the essentials for web development without imposing structure. It uses Jinja2 templates and Werkzeug WSGI toolkit, with a rich ecosystem of extensions for databases, auth, and more.
🇯🇵 日本人クリエイター向け解説
Flaskは、Pythonで手軽にWebアプリケーションを開発できるフレームワークで、Jinja2テンプレートやWerkzeugツールキットを利用し、データベースや認証など豊富な拡張機能を使って柔軟に機能を構築するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o flask.zip https://jpskill.com/download/14907.zip && unzip -o flask.zip && rm flask.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/14907.zip -OutFile "$d\flask.zip"; Expand-Archive "$d\flask.zip" -DestinationPath $d -Force; ri "$d\flask.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
flask.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
flaskフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Flask
Flask は Python のためのマイクロウェブフレームワークです。設計上最小限であり、ORM、認証システム、構造は自分で選択します。エクステンションがそのギャップを埋めます。
インストール
# Flask をインストール
pip install flask
プロジェクト構造
# ブループリントを使用した推奨される Flask プロジェクトレイアウト
app/
├── __init__.py # アプリケーションファクトリ
├── config.py # 設定クラス
├── models.py # SQLAlchemy モデル
├── extensions.py # エクステンションのインスタンス
├── auth/
│ ├── __init__.py # Auth ブループリント
│ ├── routes.py
│ └── forms.py
├── main/
│ ├── __init__.py # Main ブループリント
│ └── routes.py
├── templates/
│ ├── base.html
│ └── auth/
└── static/
アプリケーションファクトリ
# app/__init__.py — アプリケーションファクトリパターン
from flask import Flask
from .extensions import db, migrate, login_manager
from .config import Config
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(config_class)
db.init_app(app)
migrate.init_app(app, db)
login_manager.init_app(app)
from .auth import bp as auth_bp
from .main import bp as main_bp
app.register_blueprint(auth_bp, url_prefix="/auth")
app.register_blueprint(main_bp)
return app
# app/extensions.py — エクステンションのインスタンス
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager
db = SQLAlchemy()
migrate = Migrate()
login_manager = LoginManager()
login_manager.login_view = "auth.login"
設定
# app/config.py — 設定クラス
import os
class Config:
SECRET_KEY = os.environ.get("SECRET_KEY", "dev-key")
SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL", "sqlite:///app.db")
SQLALCHEMY_TRACK_MODIFICATIONS = False
class TestConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = "sqlite:///:memory:"
ルートとブループリント
# app/main/routes.py — main ブループリントのルート
from flask import render_template, request, redirect, url_for, flash, jsonify
from flask_login import login_required, current_user
from . import bp
from ..models import Post
from ..extensions import db
@bp.route("/")
def index():
page = request.args.get("page", 1, type=int)
posts = Post.query.order_by(Post.created_at.desc()).paginate(page=page, per_page=20)
return render_template("main/index.html", posts=posts)
@bp.route("/post", methods=["POST"])
@login_required
def create_post():
post = Post(body=request.form["body"], author=current_user)
db.session.add(post)
db.session.commit()
flash("Post created!")
return redirect(url_for("main.index"))
# app/main/__init__.py — ブループリントの定義
from flask import Blueprint
bp = Blueprint("main", __name__)
from . import routes
モデル
# app/models.py — SQLAlchemy モデル
from datetime import datetime, UTC
from flask_login import UserMixin
from .extensions import db, login_manager
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(256))
posts = db.relationship("Post", backref="author", lazy="dynamic")
@login_manager.user_loader
def load_user(id):
return db.session.get(User, int(id))
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.Text, nullable=False)
created_at = db.Column(db.DateTime, default=lambda: datetime.now(UTC))
user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
API ルート
# app/api/routes.py — JSON API エンドポイント
from flask import jsonify, request, abort
from . import bp
from ..models import Post
from ..extensions import db
@bp.route("/posts")
def get_posts():
posts = Post.query.order_by(Post.created_at.desc()).limit(50).all()
return jsonify([{"id": p.id, "body": p.body, "author": p.author.username} for p in posts])
@bp.route("/posts", methods=["POST"])
def create_post():
data = request.get_json()
if not data or "body" not in data:
abort(400)
post = Post(body=data["body"], user_id=data["user_id"])
db.session.add(post)
db.session.commit()
return jsonify({"id": post.id}), 201
@bp.errorhandler(404)
def not_found(e):
return jsonify(error="Not found"), 404
テンプレート
<!-- templates/base.html — Jinja2 を使用したベーステンプレート -->
<!DOCTYPE html>
<html>
<head><title>{% block title %}App{% endblock %}</title></head>
<body>
<nav>
<a href="{{ url_for('main.index') }}">Home</a>
{% if current_user.is_authenticated %}
<a href="{{ url_for('auth.logout') }}">Logout</a>
{% else %}
<a href="{{ url_for('auth.login') }}">Login</a>
{% endif %}
</nav>
{% with messages = get_flashed_messages() %}
{% for msg in messages %}<div class="flash">{{ msg }}</div>{% endfor %}
{% endwith %}
{% block content %}{% endblock %}
</body>
</html>
エラー処理
# app/__init__.py — カスタムエラーハンドラ (create_app 内に追加)
@app.errorhandler(404)
def not_found(e):
return render_template("errors/404.html"), 404
@app.errorhandler(500)
def server_error(e):
db.session.rollback()
return render_template("errors/500.html"), 500
テスト
# tests/test_main.py — Flask アプリのテスト
import pytest
from app import create_app
from app.config import TestConfig
from app.extensions import db
@pytest.fixture
def client():
app = create_app(TestConfig)
with app.test_client() as client:
with app.app_context():
db.create_all()
yield client
def test_index(client):
resp = client.get("/")
assert resp.status_code == 200
実行
# 開発サーバーを実行
flask --app app run --debug --port 5000
# データベースのマイグレーション
flask --app app db init
flask --app app db migrate -m "Initial"
flask 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Flask
Flask is a micro web framework for Python. It's minimal by design — you choose your ORM, auth system, and structure. Extensions fill in the gaps.
Installation
# Install Flask
pip install flask
Project Structure
# Recommended Flask project layout with blueprints
app/
├── __init__.py # Application factory
├── config.py # Configuration classes
├── models.py # SQLAlchemy models
├── extensions.py # Extension instances
├── auth/
│ ├── __init__.py # Auth blueprint
│ ├── routes.py
│ └── forms.py
├── main/
│ ├── __init__.py # Main blueprint
│ └── routes.py
├── templates/
│ ├── base.html
│ └── auth/
└── static/
Application Factory
# app/__init__.py — application factory pattern
from flask import Flask
from .extensions import db, migrate, login_manager
from .config import Config
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(config_class)
db.init_app(app)
migrate.init_app(app, db)
login_manager.init_app(app)
from .auth import bp as auth_bp
from .main import bp as main_bp
app.register_blueprint(auth_bp, url_prefix="/auth")
app.register_blueprint(main_bp)
return app
# app/extensions.py — extension instances
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager
db = SQLAlchemy()
migrate = Migrate()
login_manager = LoginManager()
login_manager.login_view = "auth.login"
Configuration
# app/config.py — configuration classes
import os
class Config:
SECRET_KEY = os.environ.get("SECRET_KEY", "dev-key")
SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL", "sqlite:///app.db")
SQLALCHEMY_TRACK_MODIFICATIONS = False
class TestConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = "sqlite:///:memory:"
Routes and Blueprints
# app/main/routes.py — main blueprint routes
from flask import render_template, request, redirect, url_for, flash, jsonify
from flask_login import login_required, current_user
from . import bp
from ..models import Post
from ..extensions import db
@bp.route("/")
def index():
page = request.args.get("page", 1, type=int)
posts = Post.query.order_by(Post.created_at.desc()).paginate(page=page, per_page=20)
return render_template("main/index.html", posts=posts)
@bp.route("/post", methods=["POST"])
@login_required
def create_post():
post = Post(body=request.form["body"], author=current_user)
db.session.add(post)
db.session.commit()
flash("Post created!")
return redirect(url_for("main.index"))
# app/main/__init__.py — blueprint definition
from flask import Blueprint
bp = Blueprint("main", __name__)
from . import routes
Models
# app/models.py — SQLAlchemy models
from datetime import datetime, UTC
from flask_login import UserMixin
from .extensions import db, login_manager
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(256))
posts = db.relationship("Post", backref="author", lazy="dynamic")
@login_manager.user_loader
def load_user(id):
return db.session.get(User, int(id))
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.Text, nullable=False)
created_at = db.Column(db.DateTime, default=lambda: datetime.now(UTC))
user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
API Routes
# app/api/routes.py — JSON API endpoints
from flask import jsonify, request, abort
from . import bp
from ..models import Post
from ..extensions import db
@bp.route("/posts")
def get_posts():
posts = Post.query.order_by(Post.created_at.desc()).limit(50).all()
return jsonify([{"id": p.id, "body": p.body, "author": p.author.username} for p in posts])
@bp.route("/posts", methods=["POST"])
def create_post():
data = request.get_json()
if not data or "body" not in data:
abort(400)
post = Post(body=data["body"], user_id=data["user_id"])
db.session.add(post)
db.session.commit()
return jsonify({"id": post.id}), 201
@bp.errorhandler(404)
def not_found(e):
return jsonify(error="Not found"), 404
Templates
<!-- templates/base.html — base template with Jinja2 -->
<!DOCTYPE html>
<html>
<head><title>{% block title %}App{% endblock %}</title></head>
<body>
<nav>
<a href="{{ url_for('main.index') }}">Home</a>
{% if current_user.is_authenticated %}
<a href="{{ url_for('auth.logout') }}">Logout</a>
{% else %}
<a href="{{ url_for('auth.login') }}">Login</a>
{% endif %}
</nav>
{% with messages = get_flashed_messages() %}
{% for msg in messages %}<div class="flash">{{ msg }}</div>{% endfor %}
{% endwith %}
{% block content %}{% endblock %}
</body>
</html>
Error Handling
# app/__init__.py — custom error handlers (add inside create_app)
@app.errorhandler(404)
def not_found(e):
return render_template("errors/404.html"), 404
@app.errorhandler(500)
def server_error(e):
db.session.rollback()
return render_template("errors/500.html"), 500
Testing
# tests/test_main.py — testing Flask app
import pytest
from app import create_app
from app.config import TestConfig
from app.extensions import db
@pytest.fixture
def client():
app = create_app(TestConfig)
with app.test_client() as client:
with app.app_context():
db.create_all()
yield client
def test_index(client):
resp = client.get("/")
assert resp.status_code == 200
Running
# Run development server
flask --app app run --debug --port 5000
# Database migrations
flask --app app db init
flask --app app db migrate -m "Initial"
flask --app app db upgrade
Key Patterns
- Always use the application factory pattern for testability
- Use blueprints to organize code by feature
- Initialize extensions separately from
create_appto avoid circular imports - Use
flask db(Flask-Migrate) for schema changes — neverdb.create_all()in production - Access config via
current_app.configinside request context - Use
@login_requiredfrom Flask-Login for protected routes