Django | SOAP сервисы на Django

Nov 27, 2010 12:29

Не могу удержаться от того, чтобы не сделать перепост одной замечательной статьи, в которой рассказывается о библиотеке soaplib. Не вдаваясь в подробности, могу сказать, что тема SOAP меня очень интересует и теперь, хотя давно не писал о ней ничего. Тем более интересно прочитать, как SOAP-сервисы реализуются на базе Django

Цель

Как можно при помощи небольшого количества кода реализовать SOAP сервис на Django (и автоматически генерировать WSDL). От вас потребуется иметь знакомство с python, Django и понимать как написать простое django app. Вы спрашиваете почему так мало требуется? Всё дело в python и django!

Перед тем как мы начнём! 

  • Вам нужен python, правда я думаю он уже у Вас есть:) 

  • Понадобится soaplib. 

  • А также cython! 

Если у вас Ubuntu установить эти библиотеки просто - выполните команды:

$ sudo apt-get install python-setuptools python-dev cython

$ sudo easy_install soaplib
(также просто проделать установку и на других системах, не буду рассматривать их, так как уверен что для вас это легко)

К делу бойцы!
1
Я буду следовать общепринятой практике и создам для нашего сервиса отдельное django app.

$ python manage.py startapp mysoapapp
2
Затем настрою urls.py ( впрочем, вы можете сначала написать весь код app и только потом его настроить - тут неважно что было сначала "курица или яйцо"! )

1
2
3
4

from django.conf.urls.defaults import patterns
urlpatterns = patterns('',
(r'^my-soap-service/', 'myproject.mysoapapp.views.my_soap_service'),
)

3
Теперь перейдем к soap и создадим базовый класс для всех наших soap сервисов:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

import base64
from soaplib.wsgi_soap import SimpleWSGISoapApp
from soaplib.service import soapmethod
from soaplib.serializers import primitive as soap_types
from django.conf import settings
from django.http import HttpResponse

def extract_basic_credentials(request):
username, password = None, None
if 'HTTP_AUTHORIZATION' in request.META:
auth = request.META['HTTP_AUTHORIZATION'].split()
if len(auth) == 2:
if auth[0].lower() == "basic":
username, password = base64.b64decode(auth[1]).split(':')
return username, password

class Http401(Exception):
pass

class Http403(Exception):
pass

class DjangoSoapApp(SimpleWSGISoapApp):
def authenticate(self, request):
ws_username = getattr(settings, 'WS_USERNAME', None)
if ws_username:
ws_password = getattr(settings, 'WS_PASSWORD', None)
username, password = extract_basic_credentials(request)
if username == None:
raise Http401("401 Authentication required.")

if username != ws_username or password != ws_password:
raise Http403("403 Not authorized")

def __call__(self, request):
self.authenticate(request)
django_resp = HttpResponse()

def start_response(status, headers):
status, reason = status.split(' ', 1)
django_resp.status_code = int(status)

for header, value in headers:
django_resp[header] = value

response = super(SimpleWSGISoapApp, self).__call__(request.META, start_response)

if django_resp.status_code == 405:
return HttpResponse("405 Method not allowed.", 'text/plain', status=405)

4
И наконец давайте напишем django view, чем и завершим написание нашего soap сервиса:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

from myproject.mysoapapp.soap import DjangoSoapApp
from myproject.mysoapapp.soap import soapmethod
from myproject.mysoapapp.soap import soap_types

class MySoapService(DjangoSoapApp):
__tns__ = '[url]http://localhost/my-soap-service/[/url]'
# чтобы определить soap метод мы должны указать аргументы каких типов он принимает.
# метод ожидает как аргумент строку и, отработав, возвращает также строку.
# конечно могут быть и другие типы (String, Integer, Float, DateTime, и т.д.)
@soapmethod(soap_types.String, _returns=soap_types.String)
def say_hello(self, name):
results = 'Hello, %s' %name
return results

# теперь создадим сервис - my_soap_service вызывается urls.py при обращении по url
my_soap_service = MySoapService()

4
запустим сервер и проверим наш сервис по адресу: http://localhost/my-soap-service/

p.s. (как всегда мне кажется что "p.s." звучит сурово! и все же.)

soaplib очень облегчает мою и вашу жизнь тем, что умеет автоматически генерировать wsdl.
Всё что нужно сделать - это обратится по адресу http://localhost/my-soap-service/?service.wsdl
Кстати, стоит помнить о том что если запускаете сервис через apache2, то с апачем нельзя использовать mod_python, а нужно - mod_wsgi
(потому что soaplib использует переменные из mod_wsgi, и которые не будут доступны если использовать mod_python)
английский оригинал тут

django, soap

Previous post Next post
Up