<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>pamiętnik programisty &#187; soap</title>
	<atom:link href="http://piotr.doniec.eu/devlog/tag/soap/feed/" rel="self" type="application/rss+xml" />
	<link>http://piotr.doniec.eu/devlog</link>
	<description></description>
	<lastBuildDate>Wed, 28 Dec 2011 23:52:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>SOAP w Pythonie</title>
		<link>http://piotr.doniec.eu/devlog/2010/01/soap-w-pythonie/</link>
		<comments>http://piotr.doniec.eu/devlog/2010/01/soap-w-pythonie/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 15:13:44 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[tricky]]></category>
		<category><![CDATA[webservices]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=396</guid>
		<description><![CDATA[Mimo że sam język jest uważany za potężny z dostępną dużą ilością bibliotek, to nie do koońca jest to prawda. SOAP w Pythonie niestety ale po prostu leży. Są 2 biblioteki umożliwiające tworzenie webserviców i tak naprawdę 2 które umożliwiają korzystanie z już utworzonych. Ja swoje próby rozpocząłem od soaplib, biblioteki która została porzucona przez [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-400" title="soap_python" src="http://piotr.doniec.eu/devlog/wp-content/uploads/2010/01/soap_python-300x227.jpg" alt="soap_python" width="210" height="159" />Mimo że sam język jest uważany za potężny z dostępną dużą ilością bibliotek, to nie do koońca jest to prawda. SOAP w Pythonie niestety ale po prostu leży. Są 2 biblioteki umożliwiające tworzenie webserviców i tak naprawdę 2 które umożliwiają korzystanie z już utworzonych. Ja swoje próby rozpocząłem od soaplib, biblioteki która została porzucona przez twórców, ale w wyniku tzw. forków w miarę często pojawiają się nowe wersje. Niestety był to błąd.<br />
<span id="more-396"></span><br />
Nowe wersje od niezależnych twórców charakteryzują się większą bądź mniejszą ilością błędów. Najlepszą wersją okazała się wersja <strong>cuker soaplib</strong>, nie spełniała tylko 1 wymogu &#8211; generowania jakiegokolwiek kodu na podstawie WSDL. Jest to pewne nadużycie z mojej strony, biblioteka dostarczyła skrypt o nazwie wsdl2py, ale potrafił on poprawnie sparsować i zinterpretować plik wsdl utworzony tylko przez soaplib, co trzeba przyznać jest lekką &#8222;kichą&#8221;. Szkoda, biblioteka aktywnie rozwijana, wiązałem z nią spore nadzieje &#8211; odpadła.<br />
<strong>Suds</strong> to druga biblioteka związana z SOAP, aktywnie rozwijana, chwalona za łatwość korzystania, niestety przykłady dotyczą tylko tworzenia klinetów, serwerów poprostu tworzyć się nie da? W połączeniu z soaplib mogł by to być całkiem ciekawy duet.<br />
Biblioteka webserwisów dla Pythona <strong>ZSI</strong>,  w założeniu ma umożliwiać tworzenie i korzystanie z różnych webserviców, niestety projekt został porzucony w 2007 roku. Ale mimo to miłe zaskoczenie, dostarczane skrypty wsdl2py i wsdl2dispatch bez problemu radzą sobie z przykładowy wsdl dostępnymi w internecie. Tworzone są 3 pliki które potem można wykorzystać do implementacji serwera i klienta. Jednakże żeby nie było zbyt miło, serwer dostarczony z biblioteką jest jedno wątkowy. Jeśli operacje obsługi żądania jednego klienta są czasochłonne, to na ten czas serwer nie odpowiada na żądania innych klientów. Fatalna sprawa, ale! światełko w tunelu, ZSI można połączyć z Apache&#8217;m poprzez wykorzystanie mod_python ( oczywiście nie mogło być wersji dla python 2.6, na szczęście VS poradziło sobie z kompilacją ). Kolejna ślepa uliczka &#8211; jak bym tworzył stronę WWW. Przychodzi żądanie tworzone są wszystkie klasy a po zakończeniu obsługi usuwane &#8211; nie tak sobie wyobrażałem mój system rozproszony, zamiast w Pythonie mógłbym go napisać w PHP (sic!). Powrót do ZSI i eureka, ktoś bardziej doświadczony w tym języku dopisał kilka linii kodu do źródła i serwer stał się wielowątkowy! Połączenie idealne, wielowątkowość obsługi żądań, nie niszczenie wszystkiego po zakończeniu obsługi, możliwośc wypisywania komunikatów na ekran konsoli.<br />
Źródło rozwiązania: http://osdir.com/ml/python.pywebsvcs.general/2008-06/msg00019.html . Autor wykorzystał co prawda ZSI-2.1-a1, ale poprawka działa również na ostatniej stabilnej wersji ZSI-2.0</p>
<p>Na wszelki, skopiowany kod poprawki poniżej:</p>
<blockquote><p>&#8212; ZSI-2.1-a1/ZSI/ServiceContainer.py 2007-08-08 00:56:37.000000000 +0200<br />
+++ ServiceContainer.py 2008-06-19 13:50:11.000000000 +0200<br />
@@ -5,6 +5,7 @@</p>
<p>import urlparse, types, os, sys, cStringIO as StringIO, thread,re<br />
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer<br />
+from SocketServer import ThreadingMixIn<br />
from ZSI import ParseException, FaultFromException,<br />
FaultFromZSIException, Fault<br />
from ZSI import _copyright, _seqtypes, _get_element_nsuri_name, resolvers<br />
from ZSI import _get_idstr<br />
@@ -30,6 +31,7 @@<br />
SimpleWSResource<br />
SOAPRequestHandler<br />
ServiceContainer<br />
+ ThreadedServiceContainer<br />
&#8222;&#8221;"<br />
class NoSuchService(Exception): pass<br />
class UnknownRequestException(Exception): pass<br />
@@ -141,12 +143,16 @@<br />
return SendFault(FaultFromException(e, 0, sys.exc_info()[2]), **kw)</p>
<p>-def AsServer(port=80, services=()):<br />
+def AsServer(port=80, services=(), threaded=False):<br />
&#8221;&#8217;port &#8211;<br />
services &#8212; list of service instances<br />
+ threaded &#8212; in modo multithread ?<br />
&#8221;&#8217;<br />
address = (&#8221;, port)<br />
- sc = ServiceContainer(address, services)<br />
+ if threaded:<br />
+ sc = ThreadedServiceContainer(address, services)<br />
+ else:<br />
+ sc = ServiceContainer(address, services)<br />
sc.serve_forever()</p>
<p>@@ -467,6 +473,11 @@<br />
def removeNode(self, url):<br />
self._nodes.removeNode(url)</p>
<p>+class ThreadedServiceContainer(ThreadingMixIn, ServiceContainer):<br />
+ &#8221;&#8217;Multithreaded version of ServiceContainer.<br />
+ &#8221;&#8217;<br />
+ pass<br />
+</p>
<p>class SimpleWSResource(ServiceSOAPBinding):</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2010/01/soap-w-pythonie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

