GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

jeffknupp

sandman – サンドマンは「物事を残す」

投稿日:

サンドマンは「物事を残す」。

このバージョンは廃止されました。https://github.com/jeffknupp/sandman2をご利用ください。

話し合います

サンドマンについて質問する場所をお探しですか? sandman-discussフォーラムとsandman-usersフォーラムをチェックしてください!

ドキュメンテーション

Sandmanのドキュメント

sandman “物事をRESTにする”。 既存のデータベースをREST API経由で公開しますか? 通常は、使用しているORM用の大量の定型コードを作成し、それをいくつかのWebフレームワークに統合する必要があります。

私は定型文を書いたくありません。

sandmanを使用して既存のデータベースからRESTful APIサービスを作成するために必要なものは次のとおりです。

$ sandmanctl sqlite:////tmp/my_database.db

それでおしまい。 sandmanは次のことを行います:

  • データベースに接続してその内容を調べる
  • REST APIサービスの作成と起動
  • HTML管理インターフェースを作成する
  • ブラウザを開いて管理インターフェースにアクセスする

そのとおり。 従来のデータベースでは、 sandmanはREST APIを提供するだけでなく、美しい管理ページを提供し、ブラウザを管理ページに開きます それは本当にあなたのためにすべてを行います。

サポートされるデータベース

sandmanはデフォルトでSQLAlchemyと同じデータベースセットへの接続をサポートしています。 この執筆時点では、以下が含まれます:

  • MySQL(MariaDB)
  • PostgreSQL
  • SQLite
  • オラクル
  • Microsoft SQL Server
  • ファイアバード
  • 霧雨
  • Sybase
  • IBM DB2
  • SAP Sybase SQL Anywhere
  • MonetDB

認証

バージョン0.9.3以降、SandmanはHTTP基本認証を完全にサポートしています! 詳細は、ドキュメントを参照してください。

シーンの裏側

sandmanctlは実際には次のような単純なラッパーです:

from sandman import app

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///chinook'

from sandman.model import activate

activate()

app.run()

データベースにどのテーブルが含まれているのかをsandmanに知らせる必要はありません。 あなたのデータベースのsandmanを指sandman 、すべての重労働をさせてください

新しいサービスを開始してリクエストをしましょう。 私たちはそれにsandmanでいますが、フィルタ用語を指定することで、 sandmanの素晴らしいフィルタリング機能を利用できます:

> python runserver.py &
* Running on http://127.0.0.1:5000/

> curl GET "http://localhost:5000/artists?Name=AC/DC"
...
{
    "resources": [
        {
            "ArtistId": 1,
            "Name": "AC/DC",
            "links": [
                {
                    "rel": "self",
                    "uri": "/artists/1"
                }
            ]
        }
    ]
}

フィルタリング/検索を含むこれらのすべては、 5つのコードラインから自動的に利用可能です。

ああ、それでは不十分ですね。 また、Djangoスタイルの管理インターフェースを自動的に作成したいでしょうか? ファイン。 runserver.pyを実行してブラウザウィンドウがポップアップしたときに気づいたことがあります。 今すぐチェックする時間です。 Djangoスタイルの管理インターフェースがあります。このようなものを探してみてください:


sandmanが起動するたびにブラウザが自動的に開かないようにするには、 browser=False activateを呼び出します)

sandmanが利用できるようにする特定のテーブルを指定する場合は、どうすればよいですか? この小さなダイチで:

from sandman.model import register, Model

class Artist(Model):
    __tablename__ = 'Artist'

class Album(Model):
    __tablename__ = 'Album'

class Playlist(Model):
    __tablename__ = 'Playlist'

register((Artist, Album, Playlist))

エンドポイント用のカスタムロジックを追加したい場合は、 または、エンドポイント名を変更しますか? または、最上位のjsonオブジェクト名を変更しますか? または、検証を追加しますか? すべてサポートされています。 ここには “ファンシーな”クラス定義があります:

class Style(Model):
    """Model mapped to the "Genre" table

    Has a custom endpoint ("styles" rather than the default, "genres").
    Only supports HTTP methods specified.
    Has a custom validator for the GET method.

    """

    __tablename__ = 'Genre'
    __endpoint__ = 'styles'
    __methods__ = ('GET', 'DELETE')
    __top_level_json_name__ = 'Genres'

    @staticmethod
    def validate_GET(resource=None):
        """Return False if the request should not be processed.

        :param resource: resource related to current request
        :type resource: :class:`sandman.model.Model` or None

        """

        if isinstance(resource, list):
            return True
        elif resource and resource.GenreId == 1:
            return False
        return True

sandman場合は、定型コードは不要です。 実際、 sandmanctlsandmanctl、コードは全く必要ありません あなたの既存のデータベース構造とスキーマがイントロスペクトされ、データベーステーブルが魔法のようにRESTfulなAPIと管理インターフェースを取得します。 テーブルごとに、 sandmanは次を作成します。

  • 適切なエンドポイント
  • 構成可能なHTTP動詞セットのサポート
    • 取得する
    • 役職
    • パッチ
    • PUT
    • 削除
  • 適切なrelリンクを使った応答
    • テーブル内の外部キーはリンクで表されます
  • モデルでvalidate_<METHOD>メソッドを定義validate_<METHOD>だけでカスタム検証が可能
  • __methods__属性を設定することによって、モデルに対してサポートされているメソッドを明示的にリストする
  • __endpoint__メソッドを設定してモデルのエンドポイントをカスタマイズする
  • 基本的にデータベースの前にHATEOASベースのサービスがあります

sandmanは積極的に開発されていますが、単純な事実のためにあらゆる環境で使用可能でなければなりません。

自分でレコードを追加または変更しない限り、 sandmanは決してデータベースを変更しません。 既存のデータベースに余分なテーブルを追加する必要はなく、既存のテーブルを変更する必要はありません。 あなたがsandmanを起動した場合、cURLを介してデータベースをブラウズし、 sandmanを停止すると、データベースは開始前の状態とまったく同じ状態になります。

インストール

pip install sandman

アプリケーションの例

sandman/testディレクトリを見てください。 見つかったアプリケーションは、 ChinookのサンプルSQLデータベースを使用します。

私に連絡して

sandmanに関する質問やコメント? jeff@jeffknupp.comで私にヒットしてください。

変更ログ

バージョン0.9.8

  • wheel配信形式のサポート

バージョン0.9.7

  • やや良いテスト範囲とドキュメント

バージョン0.9.6

  • sandman生成モデルと並行して既存の宣言モデルを使用するためのサポート
    • 既存のアプリケーションがあり、その中にsandmanを含める場合は、既存のモデルをsanmdman生成クラスと共にregister()関数に渡すだけです。 sandmanは既存のモデルを検出し、それらを増強します。

バージョン0.9.5

  • 新しいetagデコレータによって使用されたコードが誤って含まれていなかった重大なバグを修正しました。 PRのための@mietekに感謝します。
  • 空のコレクションのHTML表現を表示する際の問題を修正しました。
  • この問題を報告してくれた@mietekに感謝します。

バージョン0.9.4

  • setup.pyの要件部分に重大なバグを修正し、 Flask-HTTPAuth追加しFlask-HTTPAuth

バージョン0.9.3

  • 認証がサポートされました!
    • HTTP基本認証によって、APIと管理者全体を保護することができます。 詳細については、ドキュメントを参照してください。
  • ETAG
    • リソースは適切なETAGヘッダーを返し、最初の要求後に304で返信する必要があります。 これにより、APIのスループットとパフォーマンスが大幅に向上します。

バージョン0.9.2

  • metaエンドポイント
    • すべてのリソースに、それぞれのフィールドのタイプ(HTMLとJSONの両方)を記述する/<resource>/metaエンドポイントが追加されました。
  • ルートエンドポイント
    • 「ルート」エンドポイント( / )が作成されました。 アプリケーションに登録されているすべてのリソースがリストされ、さまざまなエンドポイントへのURLが含まれます。 これにより、あらかじめURLを知らなくても、「ダム」クライアントがAPIをナビゲートできます。

バージョン0.9.1

  • Python 3のサポート!
    • sandmanテストは2.7と3.4の両方に合格しました! Python 3.4は正式にサポートされています。

バージョン0.8.1

新機能

  • Linkヘッダーがリソースのリンクに設定されました
    • 関連オブジェクトへのリンクが適切なrel値になりました: related
    • 現在のリソースへのリンクは引き続きself rel値を使用します
    • リンクは、ヘッダ(RFC5988による)とリソース自体
  • JSONのページネーションが追加されました(返される1ページあたりの結果の数は固定されています)
  • 入れ子になったJSONモデルはもはやデフォルトです。 引数 “expand”を持つURLを押すと、ネストされたリソースの1つのレベルが表示されます
    • これは、機能を犠牲にすることなく、RESTの原則にさらに近づきます。

バージョン0.7.8

バグの修正

  • 同じテーブルエラーに対する複数の参照を修正しました(修正#59)







-jeffknupp
-

執筆者:

jeffknupp

sandman – サンドマンは「物事を残す」

投稿日:

(さらに…)







-jeffknupp
-

執筆者: