本日は、ミニブログプロジェクトにおいて、以下の機能改善と問題解決に取り組みました。
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_imagemeta_keywordscanonical_urljson_ldext_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を実行し、データベーススキーマを正常に更新しました。
- 上記エラー解決後、
以上の作業により、カテゴリ機能が強化され、データベース管理の基盤も整いました。
