所以我们目前有一个使用Django创建的网站。现在,我们想创建一个使用相同后端的原生iOS应用程序,因此我们不必重新编写整个代码。根据我的理解,有两种替代路线:
1)直接调用Django URL,然后调用一个函数。在该函数中,创建一个HTTPResponse,其中包含已编码的JSON数据并将其发回。
2)使用类似Tastypie的东西从Django服务器创建REST服务。但是,除了对对象进行直接的GET调用之外,我没有看到我们如何在TastyPie的Django模型中调用自定义函数。我们甚至可以这样做吗?
我发现令人惊讶的是,没有很多关于使用现有后端(如Django或RoR)从iOS使用Web服务的信息。例如,我知道Instagram使用Django,但他们如何从iOS与服务器进行通信?!
非常感谢!
答案 0 :(得分:8)
我目前正在开发适用于iPhone的iOS应用程序,后端使用Django / Tastypie。我们同时执行1和2.资源通过Tastypie提供REST样式(在auth之后),任何自定义函数调用(例如,创建新用户)由各种REST端点上的views.py处理,返回JSON。
答案 1 :(得分:4)
当你可以的时候,你应该尝试使用一种常用的做事方式,而不是重新发明轮子。鉴于此,REST是分布式系统的标准软件体系结构,当您使用实体/对象时,它可以很好地工作。
如果您有与实体交互的API,建议使用REST接口。在python上,您有Tastypie或更新的Django Rest Framework,几乎可以完成所有工作。正如你在2)中提出的那样
如果你有一个与服务交互的API,比如登录,那么你应该构建一个RPC服务,基本上是一个具有远程访问功能的函数,你在1)上解释。
通常,您需要在强大的应用程序上使用这两种方法。是的,有可能做到这一点。我同意@ sampson-chen,我们也是这样做的。我们有一个带有tastypie的REST接口,其他方法是使用自定义RPC服务完成的。
在我们的情况下,性能仍然很好,但主要取决于您在服务中调用的方法,例如,数据库查询。您有很多方法可以提高速度,例如使用Celery排队繁重的工作。
希望它有所帮助。
答案 2 :(得分:0)
REST API虽然非常有用,但它限制了您对资源执行的GET,POST,PUT,DELETE操作。这可能使表达其他动作类型变得困难,例如发送电子邮件。我发现有几种方法可以在django / tastypie中处理这个问题:
在现有资源上发出PUT / PATCH请求,设置一个标志,让您的后端知道触发操作。检测是否设置了标志可以在post_save信号处理程序中完成(使用django-model-utils FieldTracker查看字段是否从False更改为True);这也有助于确保您的应用程序逻辑在REST API之外的工作方式相同(例如通过管理站点,芹菜任务,基于HTML的视图或Python shell进行更改)。
创建非ORM资源(例如/ api / v1 / email /)并覆盖post_list()方法,在那里调用您的函数。
如其他地方所述,创建一个从属资源(/ api / v1 / myresource / send /)。