smartspaceless w Django

2010-02-10 od romanb hacks, python

Wbudowany w Django tag spaceless jest dziwny, zjada wszystkie spacje między tagami i żadnych w środku. W większości zastosowań to wystarcza ale...

Czytaj więcej (en)...

Python & SOAP - new hope

2009-09-25 od romanb python, soap

For long time I've been postponing porting of one API I work with from PHP to Python because I've heard Pythons SOAP support is awful but eventually I had to do it. SOAPpy was first failure - it couldn't handle WSDL defined types but should I expect anything from lib with version number 0.12.0_rc1 that wasn't updated since 4 years?

Next in line was little fresher ZSI. I say little because its last version was dated November 2007. It was better than SOAPpy, it correctly formated and encoded outgoing message but when response was received with same data type that was sent ZSI couldn't handle it.

After about 6 hours of debugging and forcing ZSI to work with that data type I thought "So well supported (library-wise) language like Python cannot have this particular technology supported so bad" and I started digging again. I stumbled upon hundreds of opinions like "SOAP sucks! so why you want to implement it? use REST or anything but not SOAP". Well, if it were up to me I would do it RESTfull but it wasn't! I was provided with access to third party application, they weren't able to give me anything else so I have to live with it - they won't add another API just because I use language that has bad support for protocol of their choice and many other popular languages (like PHP or Ruby) support it just like that.

And then I found it. On StackOverflow if found guy with same problem as mine. Answer he got was "use suds - it really works". I've given it a try and it works. Include, 2 lines of code and? works like charm, uses WSDL defined types, enumeration, service inspection (with type requirements) by simple "print object", unicode and so on...

So if you really need to use SOAP in Python then I recommend use suds.

Python i SOAP - jest nadzieja...

2009-09-24 od romanb python, soap

Z wielu źródeł słyszałem, że obsługa SOAP w Pythonie jest do bani, dlatego też odwlekałem przepięcie pewnego API z backendu PHP do Python jednakże co się odwlecze to nie uciecze i w końcu zmiany wprowadzić musiałem. SOAPpy odpadło jako pierwsze gdyż nie potrafiło sobie poradzić z typami zdefiniowanymi w WSDL - no ale czegóż się spodziewać po bibliotece której numer wersji zatrzymał się na 0.12.0_rc1 od 4 lat nie miała żadnej aktualizacji. Następne w kolejce było nieco świeższe ZSI, mówię nieco gdyż ostatnia wersja ZSI datowana jest na listopad 2007 roku. Radość - gdy ZSI poradziło sobie z zakodowaniem typu z WSDL i poprawnie sformatowało wychodzącą transmisję - nie trwała jednak długo. ZSI nie potrafiło poprawnie zinterpretować tego samego typu zawartego w odpowiedzi serwera.

W sumie po jakichś 6 godzinach spędzonych na próbach ustalenia miejsca błędu i zmuszenia biblioteki do poprawnej pracy, gdy moja rezygnacja sięgnęła dna pomyślałem: nie może być tak, że język tak dobrze wyposażony w biblioteki ma tak spapraną obsługę tej technologii. Zacząłem poszukiwania na nowo. Natknąłem się na wiele opinii typu "SOAP jest do bani jako taki i po co go chcesz implementować? lepiej zrób to w czym innym". Tak kochani developerzy, a co w przypadku gdy ty tylko korzystasz z dostępu do aplikacji za pomocą SOAP, nie masz żadnego wpływu na korporację która ci tą aplikację dostarcza i na pewno nie przekonasz ich, że te setki tysięcy które przeznaczyli na wdrożenie powinni wyłożyć jeszcze raz na zorganizowanie sobie alternatywy np w postaci XML-RPC tylko dlatego, że ja używam języka który nie ma porządnej biblioteki do SOAP. Tym bardziej, że obsługa tejże technologii nie stwarza PHP czy Railsom większych problemów, cała implementacja to przygotowanie danych a potem 2 linijki na komunikację z serwerem aplikacji.

I wtedy udało się. Na StackOverflow natknąłem się na człowieka z tym samym problemem któremu ktoś podpowiedział: użyj suds - to naprawdę działa. Postanowiłem spróbować i rzeczywiście. Biblioteka suds daje radę. Może nie zrywa bereciku ale naprawdę , w porządnym pythonowym stylu, daje radę! Dołączenie biblioteki, 2 linijki kodu i o dziwo: jest, działa, obsługuje zdefiniowane w WSDL typy i enumeracje, inspekcję usług i wymaganych typów przez proste print obiektu, unicode itp...

Więc jeśli ktoś z was też "wie", że SOAP w Pythonie jest beznadziejny to polecam suds.