пятница, 29 июня 2012 г.

Веб-сервисы в Django

Сегодня речь пойдёт о веб-сервисах на django. Для начала определим сам термин. Веб-cервис (англ. web service) — идентифицируемая веб-адресом программная система со стандартизированными интерфейсами. Веб-службы могут взаимодействовать друг с другом и со сторонними приложениями посредством сообщений, основанных на определённых протоколах (XML, JSON и т. д.). Веб-служба является единицей модульности при использовании сервис-ориентированной архитектуры приложения. (Данное определение взято свикипедии)
Прежде чем говорить об использовании сервисов, рассмотрим некоторые из преимуществ их использования:
  • Если ваш сервис был выложен в сети, другие приложения смогут использовать его возможности:
  • Веб-сервисы позволяют взаимодействовать приложениям, созданным на различных платформах и технологиях (например, сервис на c# может спокойно взаимодействовать с сервисом на java):
  • Веб-сервисы используют стандартизированные протоколы для общения. Все 4 слоя (сервис транспортировки, сообщения XML, описание сервисов и уровни обнаружения сервисов) используют один определённый протокол из тех, что используют веб-сервисы. Эта стандартизация протоколов по группам даёт бизнесу множество преимуществ, таких как широта выбора, уменьшение стоимости вследствие конкуренции и увеличение качества.
Это далеко не все преимущества данного подхода, однако и этой информации достаточно чтобы понять актуальность данной темы и хотя бы в общих чертах рассмотреть, как реализуются веб-сервисы.
В этой статье я рассмотрю два подхода к созданию сервисов: rest и xml-rpc. Это связано с простотой использования данных подходов в django, и лучше всего подойдёт для начинающих. В данной статье не будет подробно описаны все тонкости использования rest и xml-rpc, это всё есть в документации, мы только рассмотрим небольшие примеры использования.
Начнём с rest. REST (сокр. англ. Representational State Transfer, «передача состояния представления») — подход к архитектуре сетевых протоколов, обеспечивающих доступ к информационным ресурсам. В REST-сервисах акцент сделан на доступ к ресурсам, а не на исполнение удаленных сервисов. Например, вместо того чтобы запрашивать удаленное исполнение функции для нахождения нужного вам формуляра заказа, вы просто запрашиваете этот формуляр, примерно так же, как статичную Web-страницу.
На мой взгляд, наиболее простым и удобным инструментом для работы с rest в django является django-piston. Так же вы можете посмотреть в сторону Django Tastypie и Django REST framework.
Устанавливаем piston как описано в документации. 
В INSTALLED_APPS добавляем 'piston'.
В корне проекта создадим директорию api (обязательно создаём файл init.py). В этой же директории создадим файл handlers.py, в котором описываются интерфейсы работы с ресурсом, т.е. все манипуляции (CRUD) с нашей моделью.
Для примера в model создадим класс Book, с которым будем работать:
class Book(models.Model):
    title = models.CharField(, max_length=120)
    slug = models.CharField(max_length=50)
    description = models.TextField()

    def __unicode__(self):
        return self.title
Чтобы было проще тестировать забейте несколько книг в базу.
Теперь вернёмся к нашему файлу handlers.py. 
from piston.handler import BaseHandler
from app.models import Book
class BookHandler(BaseHandler):
    model = Book
    fields = ('id', 'title',)
В директории api создадим еще один файл - urls.py.
from django.conf.urls.defaults import *
from piston.resource import Resource
from api.handlers import FilmHandler

film_resource = Resource(FilmHandler)
urlpatterns = patterns('',
   url(r'^book/(?P\d+)/$', film_resource),
   url(r'^book/$', film_resource),
)
В urls.py проекта добавим ссылку на urls.py из api:
urlpatterns = patterns('',
   ...
   (r'^api/', include('api.urls')),
)
Теперь мы можем получить книги в формате json по адресуhttp://127.0.0.1:8000/api/books/:
[
    {
        "id": 1,
        "title": "Math"
    }, 
    {
        "id": 2,
        "title": "Math1"
    }
]
Так же piston берёт на себя всю работу по удалению, обновлению и добавлению данных, а так же многое другое. Подробнее об этом читайте в документации.
Теперь поговорим об xml-rpc. XML-RPC (сокр. от англ. Extensible Markup Language Remote Procedure Call — XML-вызов удалённых процедур) — стандарт/протокол вызова удалённых процедур, использующий XML для кодирования своих сообщений и HTTP в качестве транспортного механизма. Является прародителем SOAP, отличается исключительной простотой применения. XML-RPC, как и любой другой интерфейс RPC, определяет набор стандартных типов данных и команд, которые программист может использовать для доступа к функциональности другой программы, находящейся на другом компьютере в сети.
Для работы с этим протоколом в django ставим django-xmlrpc и добавляем в  INSTALLED_APPS ' django_xmlrpc'.
Для проверки работоспособности во views.py добавим функцию:
def multiply(a, b):
    return a*b
В settings.py:
XMLRPC_METHODS = (('app.views.multiply', 'mult'), )
В urls.py:
url(r'^xmlrpc/$', 'django_xmlrpc.views.handle_xmlrpc', name='xmlrpc'),
Теперь осталось написать клиента, который будет вызывать данную функцию и получать результаты её работы.
Клиент может выглядеть так:
import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://localhost:8000/xmlrpc/")
rez = proxy.postsMet(2,5)
print rez
>>> 
10
>>>
На этом мы закончим рассмотрение способов создания сервисов на django. Надеюсь, это статья будет вам полезной.
Оригинал статьи читаем тут, а так же другие интересные и полезные статьи на моём блоге.

0 коммент.:

Отправить комментарий

TROCKII БЛОГ Copyright © 2012 | Template created by Lev Trockii |