FastAPIでDocusaurus風サイトを構築:ステップ4 - Frontmatterの解析

要約
このガイドでは、FastAPIでpython-frontmatterを使用して、Markdownメタデータ(「title」など)を解析し、ハードコーディングする代わりにJinja2テンプレートに動的に渡す方法を示します。
意見はこのエリアに表示されます
アイキャッチ画像

前の記事では、Markdownコードブロックの構文ハイライトを追加しました。

しかし、main.pyのルーティング関数("page_title": "Hello, Markdown!")のドキュメントページタイトル({{ page_title }})がまだハードコーディングされていることに気づいたかもしれません。これは非常に柔軟性がありません。新しいドキュメントを追加するたびにコードを変更する必要があるということでしょうか?

ドキュメンテーションサイトは柔軟である必要があり、記事をいつでも追加または削除できる必要があります。記事のメタデータ(タイトル、著者、日付など)は、コンテンツと同じように、Markdownファイル自体で定義する必要があります。

この記事では、Frontmatter(Markdownファイルの先頭にメタデータを定義するための一般的な仕様)を紹介し、FastAPIがそれを解析できるようにすることで、メタデータを動的にロードできるようにします。

ステップ1:Frontmatter解析ライブラリのインストール

python-frontmatterを使用して、ファイルからFrontmatterとMarkdownコンテンツを分離および解析します。

以下のコマンドでインストールします:

ステップ2:MarkdownドキュメントにFrontmatterを追加する

次に、docs/hello.mdファイルを変更して、先頭にFrontmatterを追加しましょう。

Frontmatterブロックは3つのダッシュ(---)で囲まれます。

docs/hello.mdを更新する:

ここでは、titleauthordateの3つのメタデータフィールドを定義しました。必要に応じてさらにフィールドを追加できます。titleフィールドは最終的に記事のpage_titleとして使用されます。

ステップ3:Frontmatterを解析するようにmain.pyを変更する

単純なopen().read()の代わりに、frontmatterライブラリを使用してファイルをロードするようにget_hello_docルーティング関数を変更します。

frontmatter.load()関数は、ファイルを2つの部分に解析します:

  1. post.metadata:すべてのFrontmatterデータを含む辞書(例:{'title': 'Hello, Frontmatter!', ...})。
  2. post.content:Markdownコンテンツの本体のみを含む文字列。

main.pyを開き、次のように変更します:

ステップ4:実行してテストする

uvicorn main:app --reloadを実行してサーバーを起動します。

http://127.0.0.1:8000/docs/helloにアクセスします。

ブラウザのタブタイトルとページ上の<h1>タグが、「Hello, Markdown!」ではなく、「Hello, Frontmatter!」(hello.mdファイルのFrontmatterで定義したもの)に置き換わっていることがわかります。

結論と次のステップ

Frontmatterとその解析ロジックを導入することで、記事はサイトから完全に分離されました。

Markdown以外にも、Webサイトには画像などの静的ファイルが含まれます。FastAPIがこれらの静的ファイルを正しくデプロイし、オンラインでアクセスできるようにするにはどうすればよいでしょうか?

次の記事では、この問題を解決します。Markdownファイルで参照される静的アセット(画像など)を処理し、FastAPIによって正しくデプロイされ、最終的なWebページに表示されるようにします。

その他

サイトを構築した後、オンラインで他の人に見てもらえるようにデプロイしたいと思うかもしれません。しかし、ほとんどのクラウドプラットフォームは高価であり、このような練習プロジェクトのために高額を支払う価値はありません。

もっと経済的なデプロイ方法はありませんか?Leapcellを試してみてください。Python、Node.js、Go、Rustなどの複数の言語のデプロイをサポートしており、毎月寛大な無料枠を提供しているため、費用をかけずに最大20個のプロジェクトをデプロイできます。

Leapcell


Xでフォローする:@LeapcellJapan


本シリーズの他の記事を読む

関連記事:

Explore More
関連記事はありません。