2012-09-22 12 views
6

बस लक्षणों के लिए इस मामले में बोतल के साथ बंद शुरू, निम्नलिखित साथ http://flask.pocoo.org/docs/views/फ्लास्क - नेस्टेड आराम एपीआई - विधिदृश्य के अलावा कुछ और उपयोग करें या मैंने खराब डिजाइन किया है?

कहो पर मैं एक बुनियादी 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) 

लेकिन, चलो कहते हैं कि मैं इन व्यक्तिगत लक्षणों पर एक और एपीआई देते करना चाहते हैं 10

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

मेरे पास उपर्युक्त दो के बजाय 4 जीईटी होगा।

  1. क्या आपको यह बुरा एपीआई डिज़ाइन लगता है?
  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) 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^