Django的HTTP REST工具包
项目描述
简介
Django Restlayer是一个非常简单易用的工具包,用于为您的Django项目或应用创建RESTful API。
功能
允许您在应用程序中尊重HTTP方法和头部。
基于类的资源。
易于编码。
如果需要,可以进行表单验证。
安装
对于Django 1.4: pip install django-restlayer==0.8.5
对于Django 1.5+: pip install django-restlayer
配置
Django Restlayer不需要任何配置,也不需要在INSTALLED_APPS设置中添加任何应用。
简单示例
urls.py
from django.conf.urls import patterns, url urlpatterns = patterns('', url(r'^$', 'myapp.resources.simple', name='simple'), )
myapp/resources.py
from restlayer import Resource, Response # Our resource class class SimpleResponse(Response): def response_get(self, request): return ['foo', 'bar'] # Resource (a callable object or a view if you prefer) simple = Resource(SimpleResponse)
就这样。现在,查询您的开发服务器
curl -s -v -H "accept:application/json" https://:8000/ > GET /api/ HTTP/1.1 > User-Agent: curl/7.33.0 > Host: localhost > accept:application/json > < HTTP/1.1 200 OK < Server: nginx/1.4.3 < Date: Thu, 28 Nov 2013 14:34:15 GMT < Content-Type: application/json; charset=UTF-8 < Transfer-Encoding: chunked < Connection: keep-alive < Vary: Accept-Language, Cookie < Content-Language: en < [ "foo", "bar" ]
用法
响应类
所有响应都应继承自restlayer.Response类。然后,添加名为response_VERB的方法,其中VERB是HTTP动词。要处理GET响应,需要创建response_get方法,对于POST,创建response_post。每个response_VERB方法都充当一个带有所需参数的视图。基本示例
from restlayer import Response class SimpleResponse(Response): def response_get(self, request, my_id): # This method will match a URL pattern with "my_id" return "foo"
预定义响应方法
有两种预定义的响应方法
response_options 返回一个带有Allow头部的空204响应。
response_head 如果存在则调用response_get,并返回不带主体的它。
序列化器
您可以设置 序列化器 和 反序列化器 属性。它们设置数据如何进行序列化(输出)或反序列化(输入)。在本例中,我们为 text/plain 添加了一个愚蠢的序列化器。
class SimpleResponse(Response): serializers = Response.serializers + ( ('text/plain', lambda x: return str(x)) )
这不太可能很好用,但您应该明白。 序列化器 是一个包含 MIME 类型与可调用对象的元组的列表。可调用对象仅接受数据作为参数。 反序列化器 与接受的数据类型相同(可调用对象仅接受 request 作为参数)。
默认格式为
- 序列化器
application/json
application/xml
application/python-pickle
- 反序列化器
application/x-www-form-urlencoded
multipart/form-data
application/json
响应是有效的 HttpResponse 对象
restlayer.Response 实例是有效的 django.http.HttpResponse 对象。因此,您可以
在返回数据之前,通过设置 self['my-header'] 添加任何您想要的响应头;
使用 self.status_code 更改状态码;
如果您需要设置特定响应内容而不使用序列化器,则返回 self。
资源
您的响应类应包装在 restlayer.Resource 类中。生成的实例是一个类似于经典视图的可调用对象。您可以扩展此类来创建自己的资源。只需重写 __call__ 方法即可。
from restlayer import Resource class SillyResource(Resource): def __call__(self, request, *args, **kwargs): rsp = super(SillyResource, self).__call__(request, *args, **kwargs) rsp.status_code = 401 rsp['Content-Type'] = 'text/plain' return rsp
Django 模型的响应
如果您正在使用 Django 模型,则可以使用 restlayer.ModelResponse。使用此父类作为您的响应,您可以返回模型实例或查询集。以下是一个简单的示例
from django.contrib.auth.models import User from restlayer import ModelResponse class SimpleResponse(ModelResponse): fields = ('id', 'name', 'firstname', 'email') def response_get(self, request): return User.objects.all()
就是这样!使用 fields 属性,您可以设置在响应中返回的字段。
您可以添加自定义方法来创建特定的响应字段。此方法接受两个参数:实例 和 request。示例
from django.contrib.auth.models import User from restlayer import ModelResponse class SimpleResponse(ModelResponse): fields = ('id', 'name', 'firstname', 'email', 'other_field') def other_field(self, instance, request): return instance.name.capitalize() def response_get(self, request): return User.objects.all()
URL
您经常需要创建一个 resource_uri 字段,以指向 API 中的另一个资源。响应类提供两种方法来创建绝对(带 FQDN)URL
_build_absolute_uri(self, request, [location]) 仅调用 request.build_absolute_uri(location),但您可以根据需要覆盖它。
reverse(self, request, view, [args, kwargs]) 作为 django.core.urlresolvers.reverse,但返回一个绝对 URL。
分页
您可能想要对响应进行分页。Restlayer Response 类提供了一种简单的方法来执行此任务:paginate(self, request, object_list, [limit]),这是 django.core.paginator.Paginator 的简单包装。生成的响应将包含以下头
X-Pages-Objects
X-Pages-Count
X-Pages-Current
X-Pages-Next(如果存在下一页)
X-Pages-Next-URI(如果存在下一页)
X-Pages-Prev(如果存在上一页)
X-Pages-Prev-URI(如果存在上一页)
使用源代码
我承认这份文档有些粗糙。不要犹豫,阅读源代码,这里没有隐藏的火箭科学,只有一些基本的 Python 代码 :)
许可证
Django Restlayer 在 MIT 许可下发布。有关完整许可信息,请参阅 LICENSE 文件。