FastAPI+Jinja2でnpm(node.js)を使わずpythonのみでtailwind cssを使えるようにする

公開日:
目次

Python使いの人でフロントをやらない人は、CSSを自分で書きたくない人が多いと思います。

その際にTailwind CSSは便利です。

一方でPythonで開発しているとTailwind CSSのためだけにNode.jsを入れるのは面倒ですし、プロジェクトによっては不可の場合もあると思います。

そんな時は、pytailwindcssというパッケージを利用するとNode.jsを入れることなくPythonのみでTailwind CSSを利用することができます。

pytailwindcssの使い方

pytailwindcssのインストール

まずは下記のようにpipコマンドでpytailwindcssをインストールします。

pip install pytailwindcss

これでパッケージが入ります。

Tailwind CSSを入れる

先ほど入れたパッケージを利用してTailwindをインストールします。

下記のコマンドを実行してください。

tailwindcss

これでTailwind CSSがインストールされます。

Tailwind CSSのconfigファイルを作成する

次にtailwindを実行するのに必要なconfigファイルを作成します。

tailwindcss init

tailwind.config.jsがプロジェクトのルートディレクトリに作成されます。

設定ファイルを変更する。

先ほど作成されたconfigファイルの中身を変更します。

contentに自分がtailwindを利用するディレクトリを選択します。

jinja2を利用している方はtemplatesフォルダ以下でtailwindを使うと思うので、下記のように設定してください。

tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ["templates/**/*.html"],
  theme: {
    extend: {},
  },
  plugins: [],
}

Tailwindで利用する入力用と出力用のCSSファイルを作成する

プロジェクトの好きな場所に入力用と出力用のCSSファイルを作成します。

下記の通り、入力用CSSにTailwindの指定を追加します。

input.css
@tailwind base;
@tailwind components;
@tailwind utilities;

HTMLファイルにCSSを記入する

Tailwind CSSは使われているクラスのみをビルドするため、configで指定したcontent内のHTMLに何も書いていないとCSSが出力されません。

試すだけなら下記のように、CDNからCSSを適用させると便利です。(tailwindを出力後に削除してください)

index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
    <title>Tailwind Example</title>
    <script src="https://cdn.tailwindcss.com"></script>
  </head>
  <body class="bg-gray-500">
    <p class="text-white">
      Tailwind CSSの利用例
    </p>
  </body>
</html>

Tailwind CSSでビルドする

実際に利用するCSSをビルドします。

下記のようにビルドコマンドを実行してください。

tailwindcss -i [入力用のcssファイルのパス] -o [出力用のcssファイルのパス] --minify

私はstaticディレクトリ配下にcssをまとめたフォルダ(css)があり、そこにinput.cssとoutput.cssという名前で入出力用cssを作成したので、下記のようにコマンドを入力しました。

tailwindcss -i static/css/input.css -o static/css/output.css --minify

FastAPI環境のJinjaで出力したCSSを適用する

出力したCSSを適用します。Python側とHTML側の設定が必要です。

Jinja2を利用している場合は、下記の通りに設定します。

python(FastAPI)側の設定

cssがstaticディレクトリ配下に入っているとしたら、下記の通りstatic配下を認識できるようにStaticFilesを設定します。

main.py
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from starlette.requests import Request

app = FastAPI()

# 静的ファイル(CSS)の設定
app.mount("/static", StaticFiles(directory="static"), name="static")

# Jinja2テンプレートの設定
templates = Jinja2Templates(directory="templates")

@app.get("/")
async def read_root(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})

HTML側の設定

次に、html(Jinja2テンプレート)を設定します。

仮にtemplates/index.htmlファイルに適用する場合は、下記のようにCSSを読み込むためのリンクを追加します。

cssディレクトリ配下にoutput.cssという名前で出力用cssを定義した場合です。

index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>FastAPI with Jinja2</title>
    <link rel="stylesheet" href="{{ url_for('static', path='/css/output.css') }}">
</head>
<body>
    <h1>Hello, FastAPI with Jinja2!</h1>
</body>
</html>

これでtailwind cssが適用されるはずです。

JinjaでTailwind CSSを利用する際の注意点

Tailwind CSSのクラス名を動的に生成する場合は、minifyで作成すると認識してくれずにCSSが適用できないるので注意しましょう。

参考