如何从类定义中调用REST API

时间:2014-03-28 15:24:30

标签: python django rest

我正在对外部部门进行一些RESTful API调用,并编写了各种函数(类似于下面的代码片段),根据我需要的信息处理这些函数(例如“注册”,“人员”等。 )。现在我想知道将它放入类中是否会更加pythonic,我认为这样可以更容易地进行处理,例如“has_a_passing_grade”等,并将其作为属性或其他内容传递出去当类被实例化时。

有没有一种标准的方法可以做到这一点?它是否像创建类一样简单,以某种方式构建api_url,就像我在下面所做的那样,调用api,解析和格式化数据,构建一个dict或者要返回的东西,然后完成?那个班级的召唤怎么样呢?有没有人有一些类似的可以共享的示例代码?

先谢谢你的帮助!

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), ''

1 个答案:

答案 0 :(得分: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错误,你是否真的可以继续,例如?