本日は、ミニブログプロジェクトにおいて、以下の機能改善と問題解決に取り組みました。
1. カテゴリページのページネーションと表示関連の修正
layout.html
の参照エラー解決:- カテゴリページ (
category_page.html
) で発生していたjinja2.exceptions.TemplateNotFound: layout.html
エラーに対し、ベースとなるlayout.html
を作成し、適切に参照できるようにしました。
- カテゴリページ (
current_user
未定義エラーの解決:- 記事詳細ページへのリンクエラー解決:
- カテゴリページから記事詳細ページへのリンク生成時に
werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'article_detail'
が発生しました。これに対し、app.py にarticle_detail
ルートを正しく定義し、対応するarticle_detail.html
テンプレートを作成することで解決しました。 - 結果として、カテゴリページが正常に表示され、各記事への「続きを読む」ボタンも機能するようになりました。
- カテゴリページから記事詳細ページへのリンク生成時に
2. カテゴリモデルへの追加フィールド実装
- 仕様書に基づき、SEOおよびOGP対応強化のため、
Category
モデル (models.py) に以下のフィールドを追加しました。ogp_image
meta_keywords
canonical_url
json_ld
ext_json
- 管理画面 (admin.py および関連テンプレート) で、これらの新しいフィールドをカテゴリ作成・編集時に扱えるように修正しました。
- 公開側のカテゴリページテンプレート (
category_page.html
) で、これらの新しいフィールド(特にOGP関連情報)が<head>
タグ内に出力されるように修正しました。
3. Flask-Migrate の導入とデータベーススキーマ更新
- カテゴリモデルへのフィールド追加をデータベースに反映させるため、新たに Flask-Migrate を導入しました。
- 初期設定とエラー対応:
pip install Flask-Migrate
を実行し、app.py にてMigrate
オブジェクトを初期化しました。flask db init
を実行し、マイグレーションリポジトリを作成しました。- 途中で
RuntimeError: The current Flask app is not registered with this 'SQLAlchemy' instance.
エラーが発生しました。app.py と models.py におけるSQLAlchemy
インスタンス (db
) の初期化方法とインポート順序を複数回見直し、最終的に models.py でdb = SQLAlchemy()
と定義し、app.py でそれをインポートしてdb.init_app(app)
を呼び出す形に修正することで解決しました。
- テーブル不在エラーとマイグレーション再構築:
- 上記エラー解決後、
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: articles
という新たなエラーが発生しました。 - 調査の結果、自動生成されたマイグレーションファイルの内容が、テーブルを作成する (
op.create_table
) のではなく、テーブルを削除する (op.drop_table
) 操作になっていたことが判明しました。 - この問題を解決するため、既存のデータベースファイル (
miniblog.db
) と versions ディレクトリ内の誤ったマイグレーションファイルを削除しました。 - その後、
flask db migrate -m "Create initial database schema"
コマンドを再実行し、モデル定義に基づいた正しいテーブル作成コマンド (op.create_table
) を含むマイグレーションスクリプトが生成されることを確認しました。 - 最後に
flask db upgrade
を実行し、データベーススキーマを正常に更新しました。
- 上記エラー解決後、
以上の作業により、カテゴリ機能が強化され、データベース管理の基盤も整いました。