django的一个灵活rest框架
delicious-cake的Python项目详细描述
Delicious Cake是一个灵活的、从Tastypie派生的、用于Django的Rest框架。多年来,我使用Tastypie和活塞创建了Restful API。虽然两者都有各自的优点,但都不如老django的风景那么灵活。
为什么蛋糕好吃?
----
Delicious Cake是一个框架,它消除了创建
Restful API的许多痛苦,而不施加许多限制。
----------
Tastypie使您可以轻松地获取模型并以restful的方式快速公开它们。不幸的是,这通常不是公开api的最佳方式。有些功能在
tastype的约束下很难表达。
使项目起步所需的代码量。随着您的
项目的发展,用Tastype来表达您的
理想的API变得越来越困难。
Delicious Cake是一种尝试,它将Tastype的精华以更灵活的形式呈现出来。
快把它拿出来看看是否对这个api开发模型感兴趣。
测试和文档都是稀疏的。如果有足够的兴趣,
测试覆盖率和文档将成为优先事项。
让我知道您的想法!
[mike@theitemshoppe.com](mailto:mike@theitemshoppe.com)
你知道派皮上有美味的蛋糕吗?
---------------------------
[http://pypi.python.org/pypi/delicious cake](http://pypi.python.org/pypi/delicious cake)/
或运行:
——
**resources.py**:
`` python
类cake listresource(listresource):
"一个简单的列表视图"
def get(self,request,*args,**kwargs):
返回cake.objects.all()
def head(self,request,*args,**kwargs):
返回self.get(请求,*args,**kwargs)
def post(self,请求,*args,**kwargs):
cake_form=cakeform(request.data)
响应。
返回对象,已创建(布尔值)
return cake_form.save(),true
def delete(self,request,*args,**kwargs):
cake.objects.all().delete()
@models.permalink
def get_resource_uri(self):
return('cake-list',)
类元(对象):
有关更多"资源"选项,请参阅delicious戥cake/options.py。
个别地。
detail_entity_cls=cakedetailentity
cakedetailresource(detailresource):
"一个简单的细节视图"
def get(self,request,*args,**kwargs):
返回get_object_或_404(cake,pk=kwargs['pk'])
def put(self,request,*args,**kwargs:
pk=kwargs['pk']
try:
created=false
instance=cake.objects.get(pk=pk)
除了cake.doesnotexist:
created=true
instance=cake(id=pk)
cake-form=cakeform(请求数据,实例=实例)
使用http 200 ok更新了实例
return cake_form.save(),创建了
def delete(self,request,*args,**kwargs):
get_object_或_404(cake,pk=kwargs['pk']).delete()
def head(self,request,*args,**kwargs):
return self.get(self,request,*args,**kwargs)
class meta(object):
detail_entity_cls=cakedetailentity
class cakelistresourceextra(listresource):
向所有响应添加响应头。
def process_http_response(self,http_response,实体:
http悻response['x-the-cake-is-a-lie']=false
向所有get响应添加响应头。
def process悻http悻response悻get(self,http悻response,entities):
http悻response['x-cake-count']=len(entities)
def get(self,request,*args,**kwargs):
通过指定"entity"来告诉资源使用"cakedetailentity",而不是使用默认值("cakelistenty"。
返回resourcesponse(
cake.objects.all(),entity=cakedetailentity)
def post(self,请求,*args,**kwargs):
cake-form=cakeform(请求.数据)
如果不是cake-form.is-cake-valid():
raise validationerror(cake-form.errors)
#使用自定义的"httpresponse"类或将特定参数传递给"httpresponse"类的构造函数。
例如,在此方法中,我们希望返回一个http 201(已创建)响应,其中新创建的蛋糕的uri位于"location"头中。
"httpcreated"响应的参数将是可调用的。当调用时,它将
传递一个参数,即从cake对象创建的实体。
x-the-cake-is-a-lie头,没有实体体。
return resourcesponse(
cake,include\entity=false,
response\u cls=http.httpcreated,
响应kwargs={
"位置":lambda实体:entity.get_resource_uri()}
@models.permalink
def get_resource_uri(self):
return('cake-list-extra',)
类元(对象):
实体cls=cakelistenity
````
**url.py**:
``python
``url patterns=patterns('',
url(r'^cake/(?p<;pk>;\d+/$',cakedetailresource.as庘view(),name='cake-detail'),
url(r'^cake/$',cakelistsresource.as庘view(),name='cake-list'),
url(r'^cake/extra/$',cakelistsresourceextra.as庘view(),name='cake-list-extra'),)
```
**实体.py**:
``` python
类cakeentity(实体y):
@models.permalink
def get_resource_uri(self):
return('cake-detail',(self.obj.pk,))
class cakelistenity(cakeentity):
cake_type_choices_lookup=dict(cake.cake_type_choices)
resource_id=fields.integerfield(attr='pk')
cake_type=fields.charfield(attr='cake_type')
def process_cake_type(self,cake_type):
returnself.cake_type_choices_lookup.get(蛋糕类型,'未知')
类cakedetailentity(cakelistenity):
消息=fields.charfield()
`````
**模型.py**:
``python
类蛋糕(模型.model):
蛋糕类型生日=1
蛋糕类型毕业=2
蛋糕类型幸灾乐祸=3
蛋糕类型的选择=(
(蛋糕类型的生日,你的生日蛋糕,),
(蛋糕类型的毕业,你的毕业蛋糕,),
(蛋糕类型的幸灾乐祸,你的可耻骄傲蛋糕,),)
消息=models.charfield(最大长度=128)
蛋糕类型=models.positiesmalintegerfield(db_index=true)
```
为什么蛋糕好吃?
----
Delicious Cake是一个框架,它消除了创建
Restful API的许多痛苦,而不施加许多限制。
----------
Tastypie使您可以轻松地获取模型并以restful的方式快速公开它们。不幸的是,这通常不是公开api的最佳方式。有些功能在
tastype的约束下很难表达。
项目的发展,用Tastype来表达您的
理想的API变得越来越困难。
Delicious Cake是一种尝试,它将Tastype的精华以更灵活的形式呈现出来。
快把它拿出来看看是否对这个api开发模型感兴趣。
测试和文档都是稀疏的。如果有足够的兴趣,
测试覆盖率和文档将成为优先事项。
让我知道您的想法!
[mike@theitemshoppe.com](mailto:mike@theitemshoppe.com)
你知道派皮上有美味的蛋糕吗?
---------------------------
[http://pypi.python.org/pypi/delicious cake](http://pypi.python.org/pypi/delicious cake)/
或运行:
——
**resources.py**:
`` python
类cake listresource(listresource):
"一个简单的列表视图"
def get(self,request,*args,**kwargs):
返回cake.objects.all()
def head(self,request,*args,**kwargs):
返回self.get(请求,*args,**kwargs)
def post(self,请求,*args,**kwargs):
cake_form=cakeform(request.data)
响应。
返回对象,已创建(布尔值)
return cake_form.save(),true
def delete(self,request,*args,**kwargs):
cake.objects.all().delete()
@models.permalink
def get_resource_uri(self):
return('cake-list',)
类元(对象):
有关更多"资源"选项,请参阅delicious戥cake/options.py。
个别地。
detail_entity_cls=cakedetailentity
cakedetailresource(detailresource):
"一个简单的细节视图"
def get(self,request,*args,**kwargs):
返回get_object_或_404(cake,pk=kwargs['pk'])
def put(self,request,*args,**kwargs:
pk=kwargs['pk']
try:
created=false
instance=cake.objects.get(pk=pk)
除了cake.doesnotexist:
created=true
instance=cake(id=pk)
cake-form=cakeform(请求数据,实例=实例)
使用http 200 ok更新了实例
return cake_form.save(),创建了
def delete(self,request,*args,**kwargs):
get_object_或_404(cake,pk=kwargs['pk']).delete()
def head(self,request,*args,**kwargs):
return self.get(self,request,*args,**kwargs)
class meta(object):
detail_entity_cls=cakedetailentity
class cakelistresourceextra(listresource):
向所有响应添加响应头。
def process_http_response(self,http_response,实体:
http悻response['x-the-cake-is-a-lie']=false
向所有get响应添加响应头。
def process悻http悻response悻get(self,http悻response,entities):
http悻response['x-cake-count']=len(entities)
def get(self,request,*args,**kwargs):
通过指定"entity"来告诉资源使用"cakedetailentity",而不是使用默认值("cakelistenty"。
返回resourcesponse(
cake.objects.all(),entity=cakedetailentity)
def post(self,请求,*args,**kwargs):
cake-form=cakeform(请求.数据)
如果不是cake-form.is-cake-valid():
raise validationerror(cake-form.errors)
#使用自定义的"httpresponse"类或将特定参数传递给"httpresponse"类的构造函数。
例如,在此方法中,我们希望返回一个http 201(已创建)响应,其中新创建的蛋糕的uri位于"location"头中。
"httpcreated"响应的参数将是可调用的。当调用时,它将
传递一个参数,即从cake对象创建的实体。
x-the-cake-is-a-lie头,没有实体体。
return resourcesponse(
cake,include\entity=false,
response\u cls=http.httpcreated,
响应kwargs={
"位置":lambda实体:entity.get_resource_uri()}
@models.permalink
def get_resource_uri(self):
return('cake-list-extra',)
类元(对象):
实体cls=cakelistenity
````
**url.py**:
``python
``url patterns=patterns('',
url(r'^cake/(?p<;pk>;\d+/$',cakedetailresource.as庘view(),name='cake-detail'),
url(r'^cake/$',cakelistsresource.as庘view(),name='cake-list'),
url(r'^cake/extra/$',cakelistsresourceextra.as庘view(),name='cake-list-extra'),)
```
**实体.py**:
``` python
类cakeentity(实体y):
@models.permalink
def get_resource_uri(self):
return('cake-detail',(self.obj.pk,))
class cakelistenity(cakeentity):
cake_type_choices_lookup=dict(cake.cake_type_choices)
resource_id=fields.integerfield(attr='pk')
cake_type=fields.charfield(attr='cake_type')
def process_cake_type(self,cake_type):
returnself.cake_type_choices_lookup.get(蛋糕类型,'未知')
类cakedetailentity(cakelistenity):
消息=fields.charfield()
`````
**模型.py**:
``python
类蛋糕(模型.model):
蛋糕类型生日=1
蛋糕类型毕业=2
蛋糕类型幸灾乐祸=3
蛋糕类型的选择=(
(蛋糕类型的生日,你的生日蛋糕,),
(蛋糕类型的毕业,你的毕业蛋糕,),
(蛋糕类型的幸灾乐祸,你的可耻骄傲蛋糕,),)
消息=models.charfield(最大长度=128)
蛋糕类型=models.positiesmalintegerfield(db_index=true)
```