Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Пишем backend для мобильного приложения за несколько минут

Anna | 16.06.2014 | нет комментариев
Здравствуйте! Моя основная область деятельности — разработка мобильных приложений (iOS, Android). И огромная часть приложений, использует взаимодействие с другими пользователями, хранение данных и другие задачи требующие присутствие цельного сервера. Следственно для большей части приложений доводится писать свой велосипедbackend. А так как я, в основном являюсь мобильным разработчиком, то написание этого обслуживания неизменно становится маленький задачей — доводится задействовать веб-разработчика либо искать подходящий BaaS сервис, даже если нужно написать каждого пару запросов.
Следственно было принято решение, испробовать обнаружить инструмент, дозволяющий в короткие сроки написать маленький веб-сервис, тот, что дозволено было бы применять в мобильном приложении.

За начальные данные были приняты: познание что такое HTTP, REST, JSON и первоначальный ярус разработки на Python (Django).
И вот на днях, на глаза попался маленький план, на котором дозволено было провести полевые испытания. Суть плана — приложение для одного мероприятия. Необходимо отображать спикеров и их доклады.
Позже непродолжительных поисков, за основу были взяты следующие инструменты: Python (как стержневой язык разработки), Django (как базовая платформа) и фреймворк Tastypie (представленный как фреймворк для создания API веб-сервисов). Выходит, приступим.
Создаем образец приложения Django:

python django-admin.py startproject EventApp

В настройках файла settings.py прописываем нужные настройки для базы данных, локализацию, время. Устанавливаем пакет tastypie:

pip install django-tastypie

Обратите внимание, что требуется Python2.6 и Django 1.5 . Из-за незнания этого факта пришлось потратить немножко огромнее времени, т.к. фреймворк отказывался трудиться. Помимо того, необходимо установить аналогичным образом пакет python-mimeparse.
Дальше, в файле settings.py, прописываем:

INSTALLED_APPS  = ['tastypie']

либо добавляем теснее в присутствующий список приложение ‘tastypie’.
Сейчас пропишем модели нашей предметной области:

# -*- coding: utf-8 -*-
from django.db import models

class Speaker(models.Model):
    name = models.CharField(max_length=32)
    company = models.CharField(max_length=32)
    photo = models.ImageField(upload_to='photos', blank=True, null=True)

    def __unicode__(self):
        return self.name   ' ('   self.company   ')'

class Event(models.Model):
    title = models.CharField(max_length=64)
    speaker = models.ForeignKey(Speaker, blank=False, null=False)
    start_time = models.TimeField()
    end_time = models.TimeField()

    def __unicode__(self):
        return self.title   ' ('   self.speaker.name   ')'

Мы написали модель докладчика (Speaker) и модель выступления (Event). У всякого выступления непременно есть докладчик. Сейчас, сделаем так, Дабы мы могли полновесно трудиться с нашими моделями как с источниками через REST протокол.
Создаем в нашем приложении пакет api и файлом resources.py (либо дозволено его сделать в основном пакете).

from tastypie.resources import ModelResource
from EventApp.models import Speaker, Event

class SpeakerResource(ModelResource):
    class Meta:
        queryset = Speaker.objects.all()
        resource_name = 'speaker'

class EventResource(ModelResource):
    speaker = fields.ForeignKey(SpeakerResources, 'speaker', blank=True, null=True)
    class Meta:
        queryset = Event.objects.all()
        resource_name = 'event'

В этом файле мы сотворили классы, так называемых источников, основных объектов в нашем REST сервисе. Это как раз те источники, к которым мы будем обращаться. Всякий класс содержит ссылку на ту модель, которую он представляет. Поле queryset возвращает нам комплект объектов получаемых из базы при обращении к даному источнику. Поле resource_name необязательно, и разрешает нам указать добавочно название источника, по которому он будет доступен нам.
Еще один момент, в классе EventResources мы указали отдельное поле speaker, которое указывает что источник события ссылается на источник спикера.
Сейчас осталось только прописать в файле urls.py обращения к нашему сервису. Это делает дюже легко.

from django.conf.urls.defaults import *
from tastypie.api import Api
from api.resources import EventResource, SpeakerResource

v1_api = Api(api_name='v1')
v1_api.register(SpeakerResource())
v1_api.register(EventResource())

urlpatterns = patterns('',
    (r'^api/', include(v1_api.urls)),
)

Сейчас запускаем наш план

python manage.py runserver

Сейчас, если сервер удачно запустился, открыв в браузере страницу по адресуhttp://localhost:8000/api/entry/?format=json, увидим там что фреймворк видит все наши источники и отобразил нам схему нашего обслуживания:

{
  "events": 
  {
    "list_endpoint": "/api/v1/events/"
    , "schema": "/api/v1/events/schema/"
  }
  ,"speakers": 
  {
    "list_endpoint": "/api/v1/speakers/"
    ,"schema": "/api/v1/speakers/schema/"
  }
}

Параметр format принудительно указывает в каком формате мы хотим получить данные, но взамен него дозволено в запросе указать заголовок Content-type: application/json. Помимо JSON поддерживаются xml, yaml, bplist.
По адресу schema дозволено посмотреть изложение конструкции модели (поля, типы и изложение), а по адресу list_endpoint дозволено теснее получить наши источники, которые мы заранее записали в базу.
Сейчас, открыв адрес http://localhost:8000/api/v1/events/?format=json мы увидим там что-то как бы этого:

{
  "meta": 
  {
    "limit": 20
    ,"next": null
    ,"offset": 0
    ,"previous": null
    ,"total_count": 4
  }
  ,"objects": [
  {
    "id": 3
    ,"speaker": "/api/v1/speakers/2/"
    ,"start_time": "08:39:25"
    ,"end_time": "18:39:29"
    ,"title": "Ранее что нибудь"
    ,"description": "изложение"
  }
  ]
}

Как видим — ничего трудного. В разделе meta выводится основная информация о источнике: число записей, размер выдачи и тд. Единовременно мы можем обратиться к определенному событию, обратившись к источнику по его id — http://localhost:8000/api/v1/events/1/
Можем сделать запись исполнив POST запрос и передав в него объект в JSON формате, обновить запись PUT запросом и удалить с поддержкой DELETE.
Так же, в tastypie у класса ModelResource есть огромный комплект переопределяемых полей и способов, с поддержкой которых мы можем всецело изменить конструкцию выдаваемых данных. Скажем, мы хотим взамен ссылки на спикера, сразу получать его имя, Дабы не делать ненужный запрос. В классе EventResource переопределяем способ dehydrate:

    def dehydrate(self, bundle):
        try:
            speaker = Speaker.objects.filter(id=bundle.obj.speaker.id)
            bundle.data['speaker_name'] = speaker[0].name
        except Speaker.DoesNotExist:
            pass
        return bundle

В нем, мы находим спикера в базе и подставляем его в объект bundle, тот, что представляет из себя словарь тот, что отдается источником. Сейчас, результат на запрос будет выглядеть так (напишу только основную часть):

{
  "id": 3
  ,"speaker": "/api/v1/speakers/2/"
  ,"speaker_name": "Василий"
  ,"start_time": "08:39:25"
  ,"end_time": "18:39:29"
  ,"title": "Ранее что нибудь"
  ,"description": "изложение"
}

Что нам и требовалось! Помимо того, запрос к источнику дозволено сделать с параметрами для фильтрации.
Скажем, нам нужно предпочесть все события для одного докладчика. Логичен был бы дальнейший запрос:
http://localhost:8000/api/v1/events/?speaker=1 тот, что вернет нам события, спикерами которых является спикер с id = 1. Нужно только прописать в meta класс источника еще одно поле:

        filtering = {
            'speaker': ALL_WITH_RELATIONS
        }
Завершение

Отменно! Сейчас мы теснее можем обращаться к серверу, получать от него данные. А чай именно это нам и требовалось.
Если статья вызовет интерес, то дозволено продолжить рассказ о том как сюда добавить валидацию, авторизацию и прикрутить привлекательную админку в такие кратчайшие сроки.

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB