6

Flask から始めて、http://flask.pocoo.org/docs/views/ をフォローしてください。

基本的な REST API があるとします。この場合は症状です。

/
    GET - list
    POST - create

/<symptomid>
    GET - detail
    PUT - replace
    PATCH - patch
    DELETE - delete

MethodView次のように、Flask を使用してこれをかなりきれいに実装できます。

from flask import Blueprint, request, g
from flask.views import MethodView
#...

mod = Blueprint('api', __name__, url_prefix='/api')

class SymptomAPI(MethodView):
    """ ... """

    url = "/symptoms/"

    def get(self, uid):
        if uid is None:
            return self.list()
        else:
            return self.detail(uid)

    def list(self):
        # ...

    def post(self):
        # ...

    def detail(self, uid):
        # ...

    def put(self, uid):
        # ...

    def patch(self, uid):
        # ...

    def delete(self, uid):
        # ...

    @classmethod
    def register(cls, mod):
        symfunc = cls.as_view("symptom_api")
        mod.add_url_rule(cls.url, defaults={"uid": None}, view_func=symfunc,
                         methods=["GET"])
        mod.add_url_rule(cls.url, view_func=symfunc, methods=["POST"])
        mod.add_url_rule('%s<int:uid>' % cls.url, view_func=symfunc,
                 methods=['GET', 'PUT', 'PATCH', 'DELETE'])


SymptomAPI.register(mod)

しかし、これらの個々の症状に別の API を添付したいとしましょう。

/<symptomid>/diagnoses/
    GET - list diags for symptom
    POST - {id: diagid} - create relation with diagnosis

/<symptomid>/diagnoses/<diagnosisid>
    GET - probability symptom given diag
    PUT - update probability of symptom given diag
    DELETE - remove diag - symptom relation

上記のように 2 つではなく、4 つの GET が必要になります。

  1. これは悪い API 設計だと思いますか?
  2. MethodViewこのデザインにふさわしいでしょうか?(デザインが悪くなければ)
  3. これらのルートをどのように実装しますか?

だから...この質問を書いているとき、私はまともな解決策を見つけました。私がここにいる限り、私が持っている質問と解決策を投稿することもできます. どんなフィードバックでも大歓迎です。

4

1 に答える 1

8

デザインはOKだと思います。MethodViewそれはかなり素晴らしいはずです。次のようにルートをまとめることができます。

class SymptomDiagnosisAPI(MethodView):
    """
    /<symptom_id>/diagnoses/
        GET - list diags for symptoms
        POST - {id: diagid} - create relation with diagnosis

    /<symptom_id>/diagnoses/<diagnosis_id>
        GET - probability symptom given diag
        PUT - update probability of symptom given diag
        DELETE - remove diag - symptom relation
    """

    def get(self, symptom_id, diagnosis_id):
        if diagnosis_id is None:
            return self.list_diagnoses(symptom_id)
        else:
            return self.symptom_diagnosis_detail(symptom_id, diagnosis_id)

    def list_diagnoses(self, symptom_id):
        # ...

    def post(self, symptom_id):
        # ...

    def symptom_diagnosis_detail(self, symptom_id, diagnosis_id):
        # ...    

    def put(self, symptom_id, diagnosis_id):
        # ...    

    def delete(self, symptom_id, diagnosis_id):
        # ...    

    @classmethod
    def register(cls, mod):
        url = "/symptoms/<int:symptom_id>/diagnoses/"
        f = cls.as_view("symptom_diagnosis_api")
        mod.add_url_rule(url, view_func=f, methods=["GET"],
                         defaults={"diagnosis_id": None})
        mod.add_url_rule(url, view_func=f, methods=["POST"])
        mod.add_url_rule('%s<int:diagnosis_id>' % url, view_func=f,
                         methods=['GET', 'PUT', 'DELETE'])

SymptomDiagnosisAPI.register(mod)
于 2012-09-22T05:53:15.077 に答える