Приложение iOS с Django

Итак, в настоящее время у нас есть веб-сайт, созданный с помощью Django. Теперь мы хотели бы создать родное приложение iOS, которое использует один и тот же бэкэнд, поэтому нам не нужно перекодировать все это. По моему мнению, есть два альтернативных маршрута:

1) Вызовите непосредственно URL-адреса Django, которые затем вызывают функцию. В рамках этой функции создайте HTTPResponse с закодированными данными JSON и отправьте это обратно.

2) Создайте службу REST с сервера Django с чем-то вроде Tastypie. Однако, помимо прямого прямого вызова GET на объект, я не вижу, как мы можем вызывать пользовательские функции в наших моделях Django от TastyPie. Можем ли мы это сделать?

Я нахожу удивительным, что информации о потреблении веб-службы от iOS с существующими бэкэдами, такими как Django или RoR, не так много. Например, я знаю, что instagram использует Django, но как они обмениваются данными с iOS на свои серверы?!

Спасибо большое!

Ответы

Ответ 1

В настоящее время я работаю над iOS-приложением для iPhone, с Django/Tastypie в бэкэнд. Мы делаем как 1, так и 2. Ресурсам предлагается REST-стиль (после авторизации) через Tastypie, а любые пользовательские вызовы функций (например, создание нового пользователя) обрабатываются view.py на разных конечных точках REST, которые возвращают JSON.

Ответ 2

Когда вы можете попытаться использовать общий способ сделать что-то вместо того, чтобы изобретать колесо. Учитывая, что REST - это стандартный стиль архитектуры программного обеспечения для распределенных систем, и он отлично работает при работе с объектами/объектами.

Если у вас есть API, где вы взаимодействуете с сущностями, рекомендуется использовать интерфейсы REST. На python у вас Tastypie или более новая Django Rest Framework что делает почти всю работу. Как вы предлагаете в 2)

Если у вас есть API, где вы взаимодействуете с сервисами, например, логин, тогда вы должны создать службу RPC, в основном функцию с удаленным доступом, как вы объясните в 1).

Как правило, вам понадобятся оба способа в надежном приложении. И ДА, это можно сделать. Я согласен с @sampson-chen, мы делаем то же самое. У нас есть интерфейс REST с tastypie, а другие методы выполняются с помощью специальных служб RPC.

Производительность в нашем случае по-прежнему хороша, но в основном зависит от методов, которые вы вызываете внутри своих сервисов, например, запроса БД. У вас есть много способов повысить скорость, например, используя Сельдерей для работы в тяжелых условиях.

Надеюсь, что это поможет.

Ответ 3

API REST, хотя и очень полезен, ограничивает действия GET, POST, PUT, DELETE, которые выполняются на основе ресурсов. Это может затруднить выражение других типов действий, таких как отправка электронной почты. Есть несколько способов, с помощью которых я нашел это в django/tastypie:

  • Выполните запрос PUT/PATCH на существующий ресурс, установив флаг, который позволяет вашему бэкэнду знать, чтобы вызвать действие. Обнаружение, если установлен флаг, может выполняться внутри обработчиков сообщений post_save (используйте django-model-utils FieldTracker, чтобы узнать, было ли поле изменено с False на True); это также помогает убедиться, что ваша прикладная логика работает так же вне вашего REST API (например, изменения через админ-сайт, задачу celery, представление на основе HTML или оболочку Python).

  • Создайте ресурс без ORM (например,/api/v1/email/) и переопределите метод post_list(), вызвав там свою функцию.

  • Как уже упоминалось в другом месте, создайте подчиненный ресурс (/api/v1/myresource/send/).