6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PythonAdvent Calendar 2023

Day 15

今すぐに!FastAPIとOpenSearchで開発を始めるためのテンプレート!

Posted at

FastAPI、めっちゃ便利ですよね!

昔はDjango(というかDjango REST Framework)をよく利用しており、Webバックエンドの開発はほぼ全てDjangoだったんですが、今年FastAPIで開発をしてみたらめちゃ開発体験がよく、最近ずっと利用しています。

なんですが、Djangoみたいなフルスタックフレームワークと違って、基本的な設定などは自分で行わないといけないのが結構大変だなーと思っています。

なので!サクッと使ってすぐテンプレートを作りました!

弊社はGIS(地理空間情報)を専門とする会社なので、おまけでPostGISというPostgreSQLの地理空間拡張と、最近とにかく利用しまくっているOpenSearchのコンテナも突っ込んでおきました!

使い方

リポジトリをダウンロードして、その後フォルダ名を変更します。
(フォルダ名は好きな名称で)

git clone https://github.com/nokonoko1203/fastapi-template.git
mv fastapi-template/ fastapi-app
cd fastapi-app

アプリケーションを初期化します。
appの部分はパッケージ名になるので、ここも自由な名称にしましょう

make init new=app

アプリケーション群を起動します。

make run

まずはFastAPIが立ち上がっていることを確認するためにhttp://localhost:8080/docsを見てみましょう。

image.png

API仕様書が表示されました。
FastAPIはこの機能が特に便利ですよねー!

次にhttp://localhost:5601に接続し、OpenSearch dashboardを開いてみましょう。

image.png

ユーザー名・パスワードはadmin/adminで設定しています。

ログインできたら左上のハンバーガーからサイドバーを開き、一番したのdev toolsをクリックします。

image.png

簡単なクエリをすると、ちゃんと動いていることがわかりますね!

image.png

詳しくは説明しませんが、FastAPIとの接続もできるようになっています!

  • api/src/app/services/opensearch.py
from typing import Annotated

from fastapi import Depends, Request
from opensearchpy import AsyncOpenSearch
from sample.config import settings


def get_opensearch(request: Request) -> AsyncOpenSearch:
    auth = (settings.opensearch_master_user, settings.opensearch_master_password)
    return AsyncOpenSearch(
        settings.opensearch_url,
        http_auth=auth,
        use_ssl=True,
        verify_certs=False,
        ssl_assert_hostname=False,
        ssl_show_warn=False,
    )


Opensearch = Annotated[AsyncOpenSearch, Depends(get_opensearch)]
  • api/src/sample/app.py
from fastapi import FastAPI

from .services.opensearch import AsyncOpenSearch

app = FastAPI()


@app.on_event("shutdown")
async def app_shutdown(es: AsyncOpenSearch):
    await es.close()


@app.get("/")
async def hello():
    return {"message": "Hello World"}
  • api/src/sample/config.py
from pydantic_settings import BaseSettings


class _Settings(BaseSettings):
    opensearch_url: str = "https://opensearch:9200"
    """OpenSearch の接続URL"""

    opensearch_master_user: str | None = "admin"
    """OpenSearch のマスターユーザー名"""

    opensearch_master_password: str | None = "admin"
    """OpenSearch のマスターパスワード"""


settings = _Settings()

FastAPIでOpenSearchを触っていくためのパッケージの導入や、設定が完了しているので、すぐにデータの検索・表示などを行うアプリケーションを作成していくことができます!

ぜひご利用ください!

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?