Не могу удержаться от того, чтобы не сделать перепост одной замечательной статьи, в которой рассказывается о библиотеке 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)
английский оригинал тут