将django-tastypie用于非RESTful API

时间:2013-08-01 07:51:46

标签: django api rest tastypie

假设您需要编写一个简单的非RESTful API,并希望使用django-tastypie来执行此操作,您将如何执行此操作?

Tastypie仅提供与数据模型紧密耦合的Resource

有没有办法使用tastypie的其他API实用工具(例如身份验证,serlialization等),但是将它用于“简单”API?当然这可以写成一个简单的视图,但是你会错过tastypie给你的其他东西。

一个简单的例子是接收字符串并将其反转的API。

1 个答案:

答案 0 :(得分:1)

这是prepend_urls的目的 - 您可以向现有方法添加自定义端点。开箱即用它们就像普通视图一样工作,但您现在可以从资源中调用所需的所有功能 - 并返回普通的HttpResponse或搭载现有的Tastypie函数以返回丰富对象。

例如,如果我有一个User资源并希望通过返回10来提供一个端点来确定用户当前是否经过身份验证,那么我会这样做:

def prepend_urls(self):
    return [
        #...
        url(r"^(?P<resource_name>%s)/is_authenticated?$" % (self._meta.resource_name), self.wrap_view('is_authenticated')),
        #...
    ]
# ...other methods in your Resource...
def is_authenticated(self, request, **kwargs):
    if self._meta.authentication.is_authenticated(request):
        return HttpResponse("1")
    else:
        return HttpResponse("0")

或者,如果我确实想要为经过身份验证的用户返回实际的用户资源,我可以(例如)将return HttpResponse("1")替换为return self.get_detail(request, id=request.user.id) - 有效地模拟对/user/?id=[authenticated user's ID]的调用。