2014-03-28 22 views
0

我正在對外部部門進行一些RESTful API調用,並編寫了基於我需要什麼信息處理此問題的各種函數(類似於下面的代碼片段)例如「登記」,「人」等)。現在我還在想,如果把它放在類中是不是更加pythonic,我相信這樣會更容易處理諸如「has_a_passing_grade」之類的處理,並將它作爲屬性或其他東西傳遞出去當類被實例化時。如何從類定義中調用REST API

有沒有這樣做的標準方式?是否像創建一個類一樣簡單,以某種方式構建api_url,如下所示,調用api,解析和格式化數據,構建一個字典或某個東西以返回,並完成?而這樣的課堂電話怎麼看呢?有沒有人有一些類似於這個可以共享的示例代碼?

非常感謝您的幫助!

from django.utils import simplejson 

try: 
    api_url = get_api_url(request, 'enrollment', person_id) 

    enrollment = call_rest_stop(key, secret, 'GET', api_url) 

    enrollment_raw = enrollment.read() 

    if enrollment_raw == '' or None: 
     return 'error encountered', '' 

    enrollment_recs = simplejson.loads(enrollment_raw) 

    # now put it in a dict 
    for enrollment in enrollment_recs: 
     coursework_dict = { 
      'enrollment_id': enrollment['id'], 
      ..., 
     } 
     coursework_list.append(coursework_dict) 
    cola_enrollment.close() 
except Exception, exception: 
    return 'Error: ' + str(exception), '' 
+0

您在這裏遺漏了一個重要細節:您希望使用您的API的代碼看起來如何?添加一個例子,因爲這是最重要的方面 - 在我看來,API的可用性出現在所有其他問題之前。一旦我們知道了,我們可以幫助您構建您的代碼,以正確的方式回答這些調用。 – DavidM

+0

@DavidM,我想這真的是問題的一部分。這就是我想問的問題:「這樣的班級怎麼樣?」。我對OOP還不是非常有經驗,但我猜想我想通過用所需的查找ID(例如student_ID)來實例化它: student_hist = Enrollment.get(pk = student_ID)[我知道語法有點] – KeithE

回答

0

所以,讓我們說,你希望你的API的用戶打電話給你的API,像這樣:

student_history, error_message = get_student_history(student_id) 

然後,您可以只是包裝上面的那個函數:

from django.utils import simplejson 

def get_student_history(person_id) 
    try: 
     api_url = get_api_url(request, 'enrollment', person_id) 

     enrollment = call_rest_stop(key, secret, 'GET', api_url) 

     enrollment_raw = enrollment.read() 

     if enrollment_raw == '' or None: 
      return [], 'Got empty enrollment response' 

     enrollment_recs = simplejson.loads(enrollment_raw) 

     # now put it in a dict 
     for enrollment in enrollment_recs: 
      coursework_dict = { 
       'enrollment_id': enrollment['id'], 
       ..., 
      } 
      coursework_list.append(coursework_dict) 
     cola_enrollment.close() 

     return coursework_list, None 
    except Exception as e: 
     return [], str(exception) 

你可以也可以使用一個類,但請記住,只有在那些使用API​​的方法從中受益時才應該這樣做。例如:

class EnrollmentFetcher(object): 
    def __init__(person_id): 
     self.person_id = person_id 

    def fetch_data(self): 
     self.coursework_list, self.error_message = get_student_history(self.person_id) 

    def has_coursework(self): 
     return len(self.coursework_list) > 0 


fetcher = EnrollmentFetcher(student_id) 
fetcher.fetch_data() 
if fetcher.has_coursework(): 
    # Do something 

面向對象編程既不是好的做法,也不是壞的做法。如果在任何特定情況下滿足您的需求,您應該選擇使用它。在這種情況下,它可能有助於澄清你的代碼(例如,has_coursework比檢查列表是否爲空更清楚),但它可能恰好相反。

備註:小心捕捉這樣一個廣泛的例外。例如,如果出現OutOfMemory錯誤,您是否還在繼續操作?

+0

感謝您的回答。但是,我擔心,我必須以混亂的方式提出這個問題。我已經按照你的建議......調用函數了。我真正要問的是如何讓它成爲一個班級,並如此使用它。這樣做可能沒有意義,但是我認爲我現在在項目早期就會看到它,希望在本質上使用一個類來實現這個功能。 – KeithE

+0

我已添加到我的答案中。這說明了嗎? – DavidM

+0

這對戴維很有幫助......謝謝! – KeithE