上周我收到了一封电子邮件查理奥基特而且,它的一个主题是在Django中缺乏对RESTful API的简单支持。我承诺了一个关于这个主题的快速博客条目,但它并没有真正走到一起。问题是图书馆之一。并不是没有图书馆,有一场少数,但他们没有一个人尚未达到甜蜜的地方。
我认为社区对这个缺乏没有太烦恼,因为它通常是为了写下你只需要几个观点而手工需要的舒适观点。这就是为什么许多Ajax繁重的应用程序最终将结束代码界面,该代码界限为该应用程序实现RESTful API的必要子部分:
@需要登录def更新(要求):d=要求。邮政。复制()ID=d。流行音乐('PK')[0.]模型=d。流行音乐('模型')[0.]目的=get_class.(模型)。对象。得到(PK.=ID)obj_dict.=目的。__dict__为了钥匙在d。钥匙():如果obj_dict.。has_key.(钥匙):瓦=d[钥匙]如果钥匙在Boolean_fields.:如果瓦==.你“真实”:瓦=真的el瓦==.你“假”:瓦=错误的el钥匙在slug_fields.:瓦=诽谤(瓦)el钥匙在DateTime_Fields.:T.=时间。mktime.(时间。strptime.(瓦那“%y-%m-%D.%h:%m:%s“)))瓦=约会时间。约会时间。fromTimestamp.(T.)obj_dict.[钥匙]=瓦el钥匙在many_to_many_fields.:val=d。别家(钥匙)经理=getattr.(目的那钥匙)经理。清除()如果不是(Len.(val)==.1和val[0.]==.-1):经理。添加(*val)目的。保存()返回httpresponse.(“成功”)
在这种特殊的半心半心半心半心半心半心半心半节目中,我正在使用预定义的字段元组 - 而不是实地查找 - 弄清楚如何处理某些字段。我还使用一个非常有限的权限模型 - 您登录了吗? - 由于应用程序没有记录非管理员的组件。
这是我为不同的项目写入的有点智能版本:
defgeneric_update.(要求那模型):'API的抽象更新操作。模型=locate_class_by_string.(模型)地位那obj_or_msg.那参数=Retrieve_by_id.(要求那模型)如果地位是真的:尝试:为了钥匙在参数。钥匙():瓦=参数[钥匙]F=get_field.(模型那钥匙)如果F。__班级__==.领域。有关的。外国人:瓦=F。rel.。至。对象。得到(PK.=瓦)setattr.(obj_or_msg.那钥匙那瓦)obj_or_msg.。保存()数据=简单json.。倾倒({'成功的':真的})返回httpresponse.(数据那mimetype.='application / json')除了:味精=“更新的不当参数%S.。“%模型返回erceper_api_request.(味精)别的:返回erceper_api_request.(obj_or_msg.)
我们还为我们正在做的所有其他宁静的事情进行实现,例如创建新实例:
defgeneric_create.(要求那模型):'API的抽象创建操作。defconvert_keywords.(d):'忏悔方式将Unicode Dict键转换为字符串。new_dict.={}为了钥匙在d。钥匙():new_dict.[smart_str.(钥匙)=d[钥匙]返回new_dict.模型=locate_class_by_string.(模型)参数=process_json_params.(要求)如果参数是不是没有任何:尝试:#关键字传递为参数必须是字符串,#所以这是一个促进它的黑客,但是#必须是一个清洁解决方案。参数=convert_keywords.(参数)为了钥匙在参数。钥匙():瓦=参数[钥匙]F=get_field.(模型那钥匙)如果F。__班级__==.领域。有关的。外国人:参数[钥匙]=F。rel.。至。对象。得到(PK.=瓦)新模式=模型(**参数)新模式。保存()数据=简单json.。倾倒({'成功的':真的那'PK':新模式。PK.})返回httpresponse.(数据那mimetype.='application / json')除了:味精=“创建实例的不正确的参数。”返回erceper_api_request.(味精)别的:味精=“创建实例的不正确的参数。”返回erceper_api_request.(味精)
这些实现中的每一个都具有散落的辉煌和不太精彩的支持功能。我个人的一些例子:
与魔法拼图的函数一样,将小写字母划分为正确的模型脉冲。
deflocate_class_by_string.(细绳那模块):'''根据字符串从模块返回类对象。预期输入:'案例','事件,'Email_Address''''def帽(str.):返回str.。资本化()def结合(一种那B.):返回“%S._%S.“%(一种那B.)capitalied_string.=减少(结合那地图(帽那细绳。分裂('_'))))返回getattr.(模块那capitalied_string.)
或者要检索请求的函数是指的...
defRetrieve_by_id.(要求那模型):'尝试按ID检索模型实例。参数=process_json_params.(要求)如果参数是不是没有任何和参数。has_key.('ID'):ID=参数['ID']尝试:目的=模型。对象。得到(ID=ID)返回真的那目的那参数除了ObjectDoesNotexist.:返回没有任何那“ID指的是不存在的实例。”那参数别的:返回没有任何那“没有指定有效ID。”那参数
我的意思是,该死的,我将在我坐下来写一个完整的一个休息API的平庸作品中,我打算多少次?目前我正在寻找一些现有的Django休息项目。我很确定有足够的人对解决这个问题,我们可以找到一个非常引人注目的解决方案。正如我键入我的头脑风暴,我认为为Django的最佳休息将涉及,并将在第二天或两个人中试图发布我的思想的结果。
在他们开始对他们的项目开始之前,我想听听其他人从RESTful API中需要什么。