ファウナとFastAPIによるCMS APIの構築

19815 ワード

最近のデータベースでの作業中、私は本当に面白いデータベースを見つけました.過去に、私はMongoDB(NoSQLデータベース)と他の多くのリレーショナルデータベースとの主な仕事をしました.
今日、私たちは比較的速いAPIを構築するためのPythonフレームワーク、faunaとfastapiを活用したシンプルなコンテンツ管理システムAPIを構築します.

何がファウナ


始める前に、今日のアーセナルの主要なツールを見てみましょう動物相
ファウナは、serverless databaseに格納されているデータと相互作用するためのインターフェイスです.それが走るエンジンは、「速くて、一貫していて、信頼できます…」システム「近代的なセキュリティインフラストラクチャ」
ファウナは、ハイブリッドデータベースシステム「NOSQLシステムの柔軟性とSQLデータベースの関係的な問合せおよびトランザクション能力を伴う」として見られることができます
今すぐServerlessデータベースについて話すことができます.Serverlessなデータベースは、開発者が彼らのデータをホストするために、それをホストするシステムの低レベルの詳細を心配する必要なしにする余地を与えるものです.これは、開発者は、アプリケーション自体の開発に多くの時間を費やすことができます.

FAONAデータベースの設定


開始するには、我々のプロジェクトでそれを利用できるようにするには、ファウナドライバーをインストールする必要があります.
$ pip install faunadb
我々が我々のAPIに露出しているすべての論理と資源を含む我々のmain.pyファイルを作成するつもりであるように、我々は我々のプロジェクトを始めたいです.
ファイルを作成するには、端末でこれを実行できます
$ touch main.py
我々のコードを書くことから始められる前に、我々は最初にfauna dashboardで我々のデータベースを作成する必要があります.
!〔画像記述〕
データベースを作成した後、サーバーキーを作成する必要があります.我々は、ダッシュボード上のセキュリティタブに行くと、新しいキーを作成することによってこれを行う.管理
役割がサーバーであることを確認してください
!〔画像記述〕
ファウナが一度だけ鍵をくれるのだから、どこか安全に保管する必要がある鍵を手に入れる.
今、私たちはコードを書くことができます.主に行きましょう.Pyファイル.

動物相データベースへの接続


我々はそれと対話することができますので、我々の動物相データベースに接続することによって開始されます.
そのためには、まずモジュールをDBに接続する必要があります
from faunadb import query as q
from faunadb.objects import Ref
from faunadb.client import FaunaClient
そうすれば、サーバークライアントを
serverClient = FaunaClient(secret="YOUR_FAUNADB_ADMIN_SECRET")
サーバーのクライアントは、ファウナデータAPI(我々のデータベース)と対話するために必要なものです.
ここでの我々の秘密は、我々が以前に生成したサーバーキーです.
我々のサーバークライアントを作成した後、我々はコレクションを作成することによって進みます.レイマンの用語では、コレクションは、ほとんどの特定の類似点、例えばユーザーのコレクション、学生のグループなどなどのドキュメント*のグループです.リレーショナルデータベースの観点から、テーブルとして見ることができます
@我々は、後でそれに着きます
我々は2つのコレクションを作成するでしょう、我々のユーザーのための1つと我々のポストのためのもう一つ.コレクションは、クライアントと一緒に作成することができます.
serverClient.query(q.create_collection({"name": "users"}))

serverClient.query(q.create_collection({"name": "posts"}))
次に、各コレクションのインデックスを作成します.インデックスは、コレクションからドキュメントを取得する方法です.コレクションにクエリを作成できるようにインデックスが必要です.
ユーザーと投稿のインデックスを作成しましょう
serverClient.query(q.create_index(
    {
        "name": "users_by_email",
        "source": q.collection("users"),
        "permissions": {"read": "public"},
        "terms": [{"field": ["data", "email"]}],
        "unique": True
    }
))

serverClient.query(q.create_index(
    {
        "name": "posts_by_author",
        "s_[](url)_ource": q.collection("posts"),
        "terms": [{"field": ["data", "author"]}],
    }
))

今、転送する前に、ドキュメントは何かをアドレスしましょう.コレクションにデータを書き込むと、データの個々の行として表示できるドキュメントが作成されます.リレーショナルDBの観点から、ドキュメントはテーブルの行です.
これらの準備が整ったので、コードを書きましょう.
我々は、コンテンツ管理システムを作成するには、PythonのWebフレームワーク、FastAPIを活用する.
開始するには、我々は我々のエンドポイントを構築する我々のアプリを作成します.
まず、使用するライブラリをすべてインポートしましょう
from datetime import datetime, timedelta
from fastapi import FastAPI, Path, Query, Header


# this creates our app
app = FastAPI()
それは私たちのエンドポイントとロジックを構築するこのアプリです.
我々は、この記事の動物相の基本的なCRUD機能を見ています.プロジェクトon githubのコードを見つけることができます.
開始するには、我々のアプリの登録ルートを作成してみましょう.ここで、我々はここで文書を作成して、読んで見るでしょう.その前に、エンドポイントを受け取る情報をモデル化する必要があります.このサーバーは、データのガイドとして各エンドポイント受信情報を望んでいる.
FastAPIでは、pydantic抄録すべての複雑さと私たちにこれを行うには簡単な方法を与えます.
from pydantic import BaseModel

class User(BaseModel):
    name: str
    email: str
    password: str
これはユーザークラスの基本モデルとなります.我々は、これがすぐに使われる方法を見ます.
我々のユーザーが登録する方法を作成することによって進めましょう.その前に、いくつかの追加ライブラリをインポートする必要があります.我々はここで必要なすべてのライブラリをインポートし、今ハッキングを開始します.
import uuid
from faunadb import query as q
from faunadb.objects import Ref
from datetime import datetime, timedelta
from fastapi import FastAPI


# we create our register route
@app.post('/register')
def register(user: User):  
    pass

ここでは、我々のルートがポストリクエストであると定めました.我々が以前に作成したベースモデルを思い出してください、我々はそれを利用しています、ここで我々はポストリクエストで期待しているデータに注意します.FastAPIが私たちのためにドキュメンテーションを生成することを思い出してください、そして、これも自動的にドキュメンテーションに含まれます.
では、論理を書きましょう.何をするか
  • 最初に、メールが提供されているかどうかを確認してください.
  • もしそうでなければ、新しいユーザを作成します( dbに書き込む)
  • @app.post('/register')
    def register(user: User):
        try:
            # here we read from our db using our index
            sc.query(q.get(q.match(q.index("users_by_email"), user.email)))
            return {
                "msg": "error",
                "detail": "Email has been used."
            }
        except:
            # write the user info to our db
            sc.query(q.create(q.collection('users'), {
                'data': {
                    "email": user.email,
                    "name": user.name,
                    "password": hash_password(user.password),
                    "pid": str(uuid.uuid4())
                }
            }))
            return {
                "msg": "success",
                "detail": "Created Successfully"
            }
    
    この単純なリソースでは、我々は作成し、動物の機能を読んで見た.
    いいえ、ユーザー情報の更新に進みましょう.以前に、我々は我々のユーザー情報を受け取るためにベースモデルを使用するのに気がつきました.しかし、モデル内のすべてのフィールドが強制的であり、更新リソースのため、同じモデルを使用することはできません.
    これを修正するには、単に新しいベースモデルを作成し、フィールドをオプションにします.
    class UpdateUser(BaseModel):
        name: Optional[str] = None
        email: Optional[str] = None
        password: Optional[str] = None
    
    今私たちの更新ユーザーのリソースを作成することができます
    @app.post("/update-user")
    def update_user(user: UpdateUser, x_access_token: str = Header(None)):
        try:
            data = jwt.decode(x_access_token, secret_key,
                              algorithms=['HS256'])
        except Exception:
            return {
                'msg': 'error',
                'details': 'Token is invalid'
            }
        try:
            resp = sc.query(q.get(q.match(q.index("users_by_email"), data['email'])))
        except:
            return {
                'msg': 'error',
                'details': 'User not found'
            }
        uid = resp['ref'].id()
        data = {}
        if user.email is not None:
            data["email"] = user.email
        if user.name is not None:
            data["name"] = user.name
        if user.password is not None:
            data["password"] = hash_password(user.password)
    
        sc.query(q.update(q.ref(q.collection("users"), uid), {"data": data}))
        return {
            "msg": "success",
            "details": "User updated successfully"
        }
    
    ここでは、Updateクエリでユーザーコレクション内のドキュメントを更新する方法を参照してください.
    我々は、動物相のコレクションとの相互作用の方法を見てきました.使用する構文はPythonの一般的な構文ですので、FastAPIの外部で使用することができます.
    この短い記事からいくつかのことを学びたいです.
    歓声