2012-09-22 2 views
6

だけhttp://flask.pocoo.org/docs/views/フラスコ - ネストされた残りのAPI - メソッドビュー以外のものを使用するか、または悪い設計をしましたか?

に沿って、以下、フラスコをオフに始まるが、私は、症状のため、この場合には、基本的なREST APIを持って言う:

/ 
    GET - list 
    POST - create 

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

次のように私はフラスコのMethodViewでかなりきれいにこれを実装することができます

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. これらのルートはどのように実装しますか?

だから...私はまともな解決策を見つけました。私がここにいる限り、私は質問と私の解決策を投稿するかもしれません。どんなフィードバックも依然として非常に高く評価されます。

答えて

7

デザインは大丈夫だと思います。 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) 
関連する問題