Flaskで始める簡単Webアプリ開発

# はじめに

Pythonの人気Webフレームワーク、Flaskを使ってWebアプリ開発を始めましょう。初心者にも優しく、段階的に学べる内容です。各章にはサンプルコードを用意しました。

## 1. Flaskとは

Flaskは軽量で柔軟性の高いPythonフレームワークです。最小限の設定で迅速にWebアプリを構築できます。

## 2. 環境設定

まずは仮想環境を作成し、Flaskをインストールしましょう。

```bash
python -m venv venv
source venv/bin/activate
pip install Flask
```

## 3. 最初のアプリ

シンプルな"Hello, World!"アプリを作成します。

```python
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)
```

## 4. ルーティング

URLに応じて異なる関数を呼び出すルーティングを設定します。

```python
@app.route('/user/<username>')
def show_user_profile(username):
    return f'User {username}'

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Post {post_id}'
```

## 5. テンプレート

HTMLテンプレートを使用してページをレンダリングします。

```python
from flask import render_template

@app.route('/hello/<name>')
def hello_template(name):
    return render_template('hello.html', name=name)
```

## 6. 静的ファイル

CSSやJavaScriptなどの静的ファイルを扱います。

```python
app = Flask(__name__, static_url_path='/static')
```

## 7. フォーム処理

ユーザー入力を受け取り、処理します。

```python
from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return 'Logged in'
    return render_template('login.html')
```

## 8. データベース連携

SQLAlchemyを使用してデータベースと連携します。

```python
from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
```

## 9. ユーザー認証

ログイン機能を実装します。

```python
from flask_login import LoginManager, UserMixin, login_user

login_manager = LoginManager()
login_manager.init_app(app)

class User(UserMixin, db.Model):
    pass

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))
```

## 10. RESTful API

APIエンドポイントを作成します。

```python
from flask_restful import Resource, Api

api = Api(app)

class HelloWorld(Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/')
```

## 11. エラーハンドリング

カスタムエラーページを設定します。

```python
@app.errorhandler(404)
def page_not_found(error):
    return render_template('404.html'), 404
```

## 12. ファイルアップロード

ユーザーがファイルをアップロードできる機能を追加します。

```python
from werkzeug.utils import secure_filename

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['file']
        f.save(secure_filename(f.filename))
        return 'File uploaded successfully'
    return render_template('upload.html')
```

## 13. 非同期処理

長時間かかるタスクを非同期で処理します。

```python
from flask import jsonify
from celery import Celery

celery = Celery(app.name, broker='redis://localhost:6379/0')

@celery.task
def long_task():
    # 時間のかかる処理
    pass

@app.route('/longtask', methods=['POST'])
def longtask():
    task = long_task.delay()
    return jsonify({}), 202, {'Location': url_for('taskstatus', task_id=task.id)}
```

## 14. テスト

単体テストと統合テストを作成します。

```python
import unittest

class FlaskTestCase(unittest.TestCase):
    def setUp(self):
        app.config['TESTING'] = True
        self.app = app.test_client()

    def test_hello_world(self):
        rv = self.app.get('/')
        self.assertEqual(rv.data, b'Hello, World!')

if __name__ == '__main__':
    unittest.main()
```

## 15. デプロイ

本番環境へのデプロイ方法を学びます。

```python
from waitress import serve
serve(app, host='0.0.0.0', port=8080)
```

## 16. セキュリティ

XSS対策やCSRF対策などのセキュリティ機能を実装します。

```python
from flask_wtf.csrf import CSRFProtect

csrf = CSRFProtect(app)

@app.after_request
def add_security_headers(resp):
    resp.headers['X-Content-Type-Options'] = 'nosniff'
    resp.headers['X-Frame-Options'] = 'SAMEORIGIN'
    resp.headers['X-XSS-Protection'] = '1; mode=block'
    return resp
```

以上の章を通じて、Flaskの基本から応用まで幅広く学べます。各章のコードを実際に試しながら、実践的にFlaskの使い方を身につけていきましょう。