2012-09-22 4 views
6

Wystarczy ruszania z kolbą, stosując się przy http://flask.pocoo.org/docs/views/Flask - zagnieżdżony api api - użyj czegoś innego niż widok metodyczny lub czy zrobiłem zły projekt?

Say Mam podstawowe API REST, w tym przypadku do objawów:

/ 
    GET - list 
    POST - create 

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

mogę wdrożyć to dość gładko z kolbą na MethodView następująco:

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) 

Ale, powiedzmy, że chciałbym dołączyć kolejny api na tych poszczególnych objawów:

/<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 

Będę wtedy mieć 4 GET zamiast dwóch jak wyżej.

  1. Czy uważasz, że to zły projekt aplikacji?
  2. Czy byłby to obiekt odpowiedni do tego projektu? (jeśli wzór nie jest zły)
  3. Jak wdrożysz te trasy?

Więc ... pisząc to pytanie, znalazłem przyzwoite rozwiązanie. Dopóki tu jestem, równie dobrze mogę opublikować pytanie i znaleźć rozwiązanie. Wszelkie opinie będą nadal bardzo mile widziane.

Odpowiedz

7

Myślę, że wzór jest w porządku. MethodView powinno to być całkiem niesamowite. Możesz umieścić trasy razem w następujący sposób:

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) 
Powiązane problemy