ステートマシンとジャンゴ

django プロジェクトに取り組んでいるときに、無限に車輪の再発明をしたくない場合は、必要なサードパーティ ライブラリが多数あります。途中でツリー構造、定期的/延期タスクを(格納するためのSQLクエリ(デバッグ・ツールバー、ジャンゴ・エクステンションからシルク、--print-SQL)、何かをデバッグするためのツールは、uswgiは持ってのcronのようなインターフェースをEAVはまだありますjsonfield で置き換えることができますが、これらの非常に便利なものの 1 つですが、なぜかネット上であまり議論されていないのが FSM です.





データベース内のほぼすべてのレコードには、なんらかの状態があります。たとえば、コメントの場合、モデレーターによる公開/削除/削除が可能です。店舗でのご注文について ・発行・支払い・配送・返品など さらに、ある状態から別の状態への遷移は、多くの場合、コードに塗りつぶされており、その中にはビジネス ロジックが含まれており、テストで十分にカバーする必要があります (それでも必要ですが、基本的なことをテストすることは避けることができます。 「支払い済み」の状態になって初めて「払い戻し」状態に移行できます。





このような遷移をより宣言的に 1 か所で説明することは非常に論理的です。必要なロジックとアクセス検証とともに。





django-fsm ライブラリ テストのサンプル コードを次に示します。





class BlogPost(models.Model):
    """
    Test workflow
    """
    state = FSMField(default='new', protected=True)

    def can_restore(self, user):
        return user.is_superuser or user.is_staff

    @transition(field=state, source='new', target='published',
                on_error='failed', permission='testapp.can_publish_post')
    def publish(self):
        pass

    @transition(field=state, source='published')
    def notify_all(self):
        pass

    @transition(field=state, source='published', target='hidden', on_error='failed',)
    def hide(self):
        pass

    @transition(
        field=state,
        source='new',
        target='removed',
        on_error='failed',
        permission=lambda self, u: u.has_perm('testapp.can_remove_post'))
    def remove(self):
        raise Exception('No rights to delete %s' % self)

    @transition(field=state, source='new', target='restored',
                on_error='failed', permission=can_restore)
    def restore(self):
        pass

    @transition(field=state, source=['published', 'hidden'], target='stolen')
    def steal(self):
        pass

    @transition(field=state, source='*', target='moderated')
    def moderate(self):
        pass

    class Meta:
        permissions = [
            ('can_publish_post', 'Can publish post'),
            ('can_remove_post', 'Can remove post'),
        ]
      
      



これは、とりわけレスト API に最適です。状態間の遷移のエンドポイントを自動的に作成できます。たとえば、 request /orders / id / cancel は、ビューセットの完全に論理的なアクションのように見えます。そして、アクセスを確認するために必要な情報はすでにあります! また、管理パネルのボタン、およびワークフローで美しいチャートを描画する機能:) 視覚的なワークフロー エディターもあります。非プログラマーはビジネスプロセスを説明できます





より宣言的で一般的なコードを書くほど、信頼性が高まります。より少ないコード、より少ない重複、より少ないバグ。テストは一部ライブラリの作成者にシフトし、プロジェクト固有のビジネスロジックに集中できます。








All Articles