Arayüz ve API kodunuzu Spyne ile Birleştirin Burak Arslan burak@arskom.com.tr Özgür Web Teknolojileri Günleri 19 Ekim 2012 c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 1
Konumuz Spyne ı Kullanmak Hello World Çoklu Protokol Doğrulama SQLAlchemy entegrasyonu İkincil Fonksiyonlar Katkıda bulunmak Protokol yazmak Taşıyıcı yazmak İkincil işleyici yazmak XML Ekosisteminden neler öğrenebiliriz? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 2
Spyne Nedir? Spyne, birden fazla protokol ve/veya taşıyıcı kullanarak online hizmet sunmanızı kolaylaştırır. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 3
Spyne Nedir? Aynı zamanda uygulamanızın iyi tanımlanmış bir online API sunmasına yardımcı olur. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 4
Nereden esti? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 5
Nereden Esti? Eskiden; Sadece tarayıcı sandbox ına HTML/CSS/JS üretmek yeterliydi. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 6
Nereden Esti? Eskiden; Sadece tarayıcı sandbox ına HTML/CSS/JS üretmek yeterliydi. İstemci çok beceriksiz olduğu için grafik arayüz çizimi de sunucuda yapılıyordu. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 6
Nereden Esti? Artık; Tarayıcı dışındaki uygulama sandbox larına ve sunulan hizmeti kullanan başka uygulamalara da veri üretiliyor. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 7
Nereden Esti? Artık; Tarayıcı dışındaki uygulama sandbox larına ve sunulan hizmeti kullanan başka uygulamalara da veri üretiliyor. İstemciler çok daha becerikli, o yüzden sunucunun üzerindeki bütün çizim yükü istemciye yüklenebiliyor. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 7
Nasıl başladı? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 8
Nasıl başladı? Önce protokol araştırmasına giriştim: XML / SOAP / WSDL XML / XML-RPC JSON / JSON-RPC Corba Pickle REST / HTTP Vb c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 9
Neden SOAP? XML ve XML Schema standartlarına dayanıyor. XML Schema standardında: Teorik temelleri olan veri yapıları kadar (örn. 8/16/32/64 bit tamsayı tipleri) pratikte işe yarayan veri yapıları (örn. tarih/saat) da tanımlanmış. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 10
Neden SOAP? XML ve XML Schema standartlarına dayanıyor. XML Schema standardında: Teorik temelleri olan veri yapıları kadar (örn. 8/16/32/64 bit tamsayı tipleri) pratikte işe yarayan veri yapıları (örn. tarih/saat) da tanımlanmış. XML Standardının ise; Neredeyse her platformda desteği var. Doğrulayıcısı var (lxml). Sorgulama dili var (XPath). Gizlilik (confidentiality) ve bütünlük (integrity) desteği var (PyXMLSec). c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 10
Neden SOAP? Soap, XML Schema standardına RPC, yönlendirme (routing) ve binary veri için iyileştirmeler (ve bir sürü başka özellik) ekliyor. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 11
Dezavantajları? Yavaş! Dokümanı hem işlemek yavaş hem de boyutu fazla. Soap standardının muğlak bıraktığı (dolayısıyla da uyumluluk sorunları çıkartan) bir çok nokta var. Soap kötü ününün bir kısmını da bu belgeye borçludur. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 12
Tamam, SOAP kullanmaya karar verdik... c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 13
Ama önce biraz terminoloji... c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 14
Terminoloji Taşıyıcı (Transport) Protokol Kullanıcı Kodu (User Code) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 15
TCP, UDP, vb. Taşıyıcı Protokol Application ServiceBase @rpc Dekoratörü Kullanıcı Kodu c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 16
Soaplib Rpclib Spyne 2009 Soaplib 0.8.1: 5000 İndirme Kasım 2010 1.0.0: 3000 İndirme Mart 2011 2.0.0-beta: 7000 İndirme Mart 2012 2.7.0-beta: 2000 İndirme youtube.com/watch?v=n4zdwlusbv0#t=21m58 g Explore GitHub Features Blog Sign in Eylül 2012 2.8.2-rc: 500 İndirme 29 Ekim 2012 2.9.0: 2 senedir çıkan ilk kararlı sürüm! Star 125 Fork 71 c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 17 Issues 20 Graphs
Soaplib Rpclib Spyne 2009 0.8.1: 5000 İndirme Kasım 2010 Soaplib 1.0.0: 3000 İndirme Mart 2011 2.0.0-beta: 7000 İndirme Mart 2012 2.7.0-beta: 2000 İndirme youtube.com/watch?v=n4zdwlusbv0#t=21m58 g Explore GitHub Features Blog Sign in Eylül 2012 2.8.2-rc: 500 İndirme 29 Ekim 2012 2.9.0: 2 senedir çıkan ilk kararlı sürüm! Star 125 Fork 71 c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 17 Issues 20 Graphs
Soaplib Rpclib Spyne 2009 0.8.1: 5000 İndirme Kasım 2010 1.0.0: 3000 İndirme Mart 2011 Soaplib 2.0.0-beta: 7000 İndirme Mart 2012 2.7.0-beta: 2000 İndirme youtube.com/watch?v=n4zdwlusbv0#t=21m58 g Explore GitHub Features Blog Sign in Eylül 2012 2.8.2-rc: 500 İndirme 29 Ekim 2012 2.9.0: 2 senedir çıkan ilk kararlı sürüm! Star 125 Fork 71 c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 17 Issues 20 Graphs
Soaplib Rpclib Spyne 2009 0.8.1: 5000 İndirme Kasım 2010 1.0.0: 3000 İndirme Mart 2011 2.0.0-beta: 7000 İndirme Mart 2012 Rpclib 2.7.0-beta: 2000 İndirme youtube.com/watch?v=n4zdwlusbv0#t=21m58 g Explore GitHub Features Blog Sign in Eylül 2012 2.8.2-rc: 500 İndirme 29 Ekim 2012 2.9.0: 2 senedir çıkan ilk kararlı sürüm! Star 125 Fork 71 c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 17 Issues 20 Graphs
Soaplib Rpclib Spyne 2009 0.8.1: 5000 İndirme Kasım 2010 1.0.0: 3000 İndirme Mart 2011 2.0.0-beta: 7000 İndirme Mart 2012 2.7.0-beta: 2000 İndirme youtube.com/watch?v=n4zdwlusbv0#t=21m58 g Explore GitHub Features Blog Sign in Eylül 2012 Spyne 2.8.2-rc: 500 İndirme 29 Ekim 2012 2.9.0: 2 senedir çıkan ilk kararlı sürüm! Star 125 Fork 71 c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 17 Issues 20 Graphs
Soaplib Rpclib Spyne 2009 0.8.1: 5000 İndirme Kasım 2010 1.0.0: 3000 İndirme Mart 2011 2.0.0-beta: 7000 İndirme Mart 2012 2.7.0-beta: 2000 İndirme youtube.com/watch?v=n4zdwlusbv0#t=21m58 g Explore GitHub Features Blog Sign in Eylül 2012 2.8.2-rc: 500 İndirme 29 Ekim 2012 Spyne 2.9.0: 2 senedir çıkan ilk kararlı sürüm! Star 125 Fork 71 c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 17 Issues 20 Graphs
Şu an desteklenen Protokoller XML: SOAP 1.1 / XmlObject Json: JsonObject MsgPack: MessagePackObject, MessagePackRpc Html: HtmlMicroFormat(Ç), HtmlColumnTable(Ç), HtmlRowTable(Ç) Http: HttpRpc(G) Csv: Csv(Ç) baştan yazmak gerekli (G): Sadece giriş protokolü (Ç): Sadece çıkış protokolü c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 18
Şu an desteklenen Taşıyıcılar Http Client: urllib2, Twisted Http Server: WSGI, Twisted, Django, Pyramid Null Server: Test amaçlı çağrı arayüzü. ZeroMQ: REQ/REP Soket tipi. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 19
Buraya kadar sorusu olan? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 20
Tamam, biraz da kod görelim... c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 21
Aşağıdaki basit fonksiyona bakalım: from d a t e t i m e import d a t e t i m e d e f g e t u t c t i m e ( ) : r e t u r n d a t e t i m e. utcnow ( ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 22
Şimdi bu fonksiyonu uzaktan çağrılabilir yapmak için; c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 23
Şimdi bu fonksiyonu uzaktan çağrılabilir yapmak için; 1) @rpc dekoratörü ile fonksiyonun girdi ve çıktı tiplerini belirliyoruz. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 23
d e f g e t u t c t i m e ( ) : r e t u r n d a t e t i m e. utcnow ( ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 24
from spyne. model. p r i m i t i v e import DateTime from spyne. d e c o r a t o r import s r p c d e f g e t u t c t i m e ( ) : r e t u r n d a t e t i m e. utcnow ( ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 24
from spyne. model. p r i m i t i v e import DateTime from spyne. d e c o r a t o r import s r p c @srpc ( r e t u r n s=datetime ) d e f g e t u t c t i m e ( ) : r e t u r n d a t e t i m e. utcnow ( ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 24
2) Bir ServiceBase altsınıfına koyuyoruz. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 25
from spyne. model. p r i m i t i v e import DateTime from spyne. d e c o r a t o r import s r p c @srpc ( r e t u r n s=datetime ) d e f g e t u t c t i m e ( ) : r e t u r n d a t e t i m e. utcnow ( ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 26
from spyne. model. p r i m i t i v e import DateTime from spyne. d e c o r a t o r import s r p c from spyne. s e r v i c e import S e r v i c e B a s e c l a s s DateTimeService ( S e r v i c e B a s e ) : @srpc ( r e t u r n s=datetime ) d e f g e t u t c t i m e ( ) : r e t u r n d a t e t i m e. utcnow ( ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 26
3) Daha sonra, bu hizmet tanımını kullanarak bir Application sınıfı oluşturuyoruz c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 27
[ DateTimeService ], c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 28
from spyne. a p p l i c a t i o n import A p p l i c a t i o n from spyne. p r o t o c o l. h t t p import HttpRpc h t t p r p c = A p p l i c a t i o n ( [ DateTimeService ], c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 28
from spyne. a p p l i c a t i o n import A p p l i c a t i o n from spyne. p r o t o c o l. h t t p import HttpRpc h t t p r p c = A p p l i c a t i o n ( [ DateTimeService ], t n s= spyne.examples.multiprot, c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 28
from spyne. a p p l i c a t i o n import A p p l i c a t i o n from spyne. p r o t o c o l. h t t p import HttpRpc h t t p r p c = A p p l i c a t i o n ( [ DateTimeService ], t n s= spyne.examples.multiprot, i n p r o t o c o l=httprpc ( ), o u t p r o t o c o l=httprpc ( ) ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 28
4) Son olarak, uygulamayı bir taşıyıcı ya bağlıyoruz. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 29
from spyne. s e r v e r. wsgi import W s g i A p p l i c a t i o n a p p l i c a t i o n = W s g i A p p l i c a t i o n ( h t t p r p c ) Buradaki application nesnesi herhangi bir WSGI uyumlu HTTP sunucusuna verebileceğimiz standart bir WSGI uygulaması oldu. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 30
from spyne. s e r v e r. wsgi import W s g i A p p l i c a t i o n a p p l i c a t i o n = W s g i A p p l i c a t i o n ( h t t p r p c ) Buradaki application nesnesi herhangi bir WSGI uyumlu HTTP sunucusuna verebileceğimiz standart bir WSGI uygulaması oldu. $ c u r l h t t p : / / l o c a l h o s t :9910/ g e t u t c t i m e 2012 03 09T17 : 3 8 : 1 1. 9 9 7 7 8 4 c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 30
Peki, ya biz bu fonksiyonu başka bir protokol kullanarak sunmak istersek? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 31
Misal: SOAP from spyne. a p p l i c a t i o n import A p p l i c a t i o n from spyne. p r o t o c o l. h t t p import HttpRpc from spyne. p r o t o c o l. soap import Soap11 soap = A p p l i c a t i o n ( [ DateTimeService ], t n s= spyne.examples.multiprot, i n p r o t o c o l=httprpc ( ), o u t p r o t o c o l=soap11 ( ) ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 32
Misal: SOAP $ c u r l h t t p : / / l o c a l h o s t :9910/ g e t u t c t i m e \ t i d y xml i n d e n t <? xml v e r s i o n= 1.0 e n c o d i n g= utf -8?> <s e n v : E n v e l o p e x m l n s :wsa=" http: // schemas. xmlsoap.org /ws /2003/03/ addressing " x m l n s : t n s=" spyne. examples. multiple_protocols " x m l n s : p l i n k=" http: // schemas. xmlsoap. org /ws /2003/05/ partner - link /" x m l n s : x o p=" http: // www.w3.org /2004/08/ xop / include " x m l n s : s e n c=" http: // schemas. xmlsoap.org /soap / encoding /" x m l n s : s 1 2 e n v=" http: // www.w3.org /2003/05/ soap - envelope /" x m l n s : s 1 2 e n c=" http: // www.w3.org /2003/05/ soap - encoding /" x m l n s : x s=" http: // www.w3.org /2001/ XMLSchema " x m l n s : w s d l=" http: // schemas. xmlsoap.org /wsdl /" x m l n s : x s i=" http: // www.w3.org /2001/ XMLSchema - instance " x m l n s : s e n v=" http: // schemas. xmlsoap.org /soap / envelope /" x m l n s : s o a p=" http: // schemas. xmlsoap.org /wsdl /soap /"> <senv:body> <t n s : g e t u t c t i m e R e s p o n s e> <t n s : g e t u t c t i m e R e s u l t> 2012 03 06 T17:43:30.894466 </ t n s : g e t u t c t i m e R e s u l t> </ t n s : g e t u t c t i m e R e s p o n s e> </ senv:body> </ s e n v : E n v e l o p e> c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 33
Veya, düz XML: from spyne. a p p l i c a t i o n import A p p l i c a t i o n from spyne. p r o t o c o l. h t t p import HttpRpc from spyne. p r o t o c o l. xml import XmlObject xml = A p p l i c a t i o n ( [ DateTimeService ], t n s= spyne.examples.multiprot, i n p r o t o c o l=httprpc ( ), o u t p r o t o c o l=xmlobject ( ) ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 34
Veya, düz XML: $ c u r l h t t p : / / l o c a l h o s t :9910/ g e t u t c t i m e \ t i d y xml i n d e n t <? xml v e r s i o n= 1.0 e ncoding= utf -8?> <n s 0 : g e t u t c t i m e R e s p o n s e x m l n s : n s 0="spyne.examples.multiple_protocols"> <n s 0 : g e t u t c t i m e R e s u l t> 2012 03 06 T17:49:08.922501 </ n s 0 : g e t u t c t i m e R e s u l t> </ n s 0 : g e t u t c t i m e R e s p o n s e> c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 35
Veya, HTML: from spyne. a p p l i c a t i o n import A p p l i c a t i o n from spyne. p r o t o c o l. h t t p import HttpRpc from spyne. p r o t o c o l. xml import HtmlMicroFormat html = A p p l i c a t i o n ( [ DateTimeService ], t n s= spyne.examples.multiprot, i n p r o t o c o l=httprpc ( ), o u t p r o t o c o l=htmlmicroformat ( ) ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 36
Veya, HTML: $ c u r l h t t p : / / l o c a l h o s t :9910/ g e t u t c t i m e \ t i d y xml i n d e n t <d i v c l a s s="get_utc_timeresponse"> <d i v c l a s s="get_utc_timeresult"> 2012 03 06T17 : 5 2 : 5 0. 2 3 4 2 4 6 </ d i v> </ d i v> c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 37
vesaire... c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 38
Buraya kadar sorusu olan? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 39
Giriş verisini deklaratif kısıtlarla sınırlamak da çok basit. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 40
Yani, bunu yapacağınıza: d e f get name of month ( month ) : A l d i g i 1 12 a r a s i n d a k i t a m s a y i y i ay i s m i n e d o n u s t u r u r. # g e l e n v e r i i n t o l m a y a b i l i r v a l u e = i n t ( month ) # g e l e n v e r i y u k a r i d a k i k i s i t l a r a u y m a y a b i l i r i f not (1 <= v a l u e <= 1 2 ) : r a i s e V a l u e E r r o r ( v a l u e ) r e t u r n d a t e t i m e (2000, month, 1 ). s t r f t i m e ( "%B" ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 41
Bu kadarı yeterli: c l a s s NameOfMonthService ( S e r v i c e B a s e ) : @srpc ( Integer ( ge=1, l e =12), r e t u r n s=unicode ) d e f get name of month ( month ) : r e t u r n d a t e t i m e (2000, month, 1 ). s t r f t i m e ( "%B" ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 42
Doğrulama özelliğini açmayı da unutmazsak; from spyne. a p p l i c a t i o n import A p p l i c a t i o n from spyne. p r o t o c o l. h t t p import HttpRpc r e s t = A p p l i c a t i o n ( [ NameOfMonthService ], t n s= spyne.examples.multiprot, i n p r o t o c o l=httprpc ( v a l i d a t o r= soft ), o u t p r o t o c o l=httprpc ( ) ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 43
$ c u r l l o c a l h o s t :9912/ get name of month?month=3 March c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 44
$ c u r l l o c a l h o s t :9912/ get name of month?month=3 March $ c u r l D l o c a l h o s t :9912/ get name of month?month=13 HTTP/1.0 400 Bad Request Date : Sat, 10 Mar 2012 1 4 : 2 1 : 3 6 GMT S e r v e r : WSGIServer /0.1 Python / 2. 7. 2 Content Length : 63 Content Type : t e x t / p l a i n C l i e n t. V a l i d a t i o n E r r o r The s t r i n g 13 c o u l d not be v a l i d a t e d c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 44
Buraya kadar sorusu olan? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 45
Veritabanı ile çalışmak Python ve ilişkisel veritabanlarını birarada kullanacaksanız, SQLAlchemy kullanın! (Gerçekten, Spyne kullanıp kullanmamanızın bu ( ) sözle pek alakası yok.) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 46
Spyne & SQLAlchemy 1) Kendi veritabanı nesnenizi oluşturmanız lazım. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 47
Spyne & SQLAlchemy from spyne. model. complex import TTableModel MyTableModel = TTableModel ( ) veya hazır metadatanız varsa; MyTableModel = TTableModel ( metadata ) veya hazır sınıfınız varsa; MyTableModel. A t t r i b u t e s. s q l a m e t a d a t a = \ metadata c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 48
Spyne & SQLAlchemy 2) Bu nesneyi kullanarak tablolarınızı oluşturmanız lazım c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 49
Spyne & SQLAlchemy c l a s s User ( MyTableModel ) : t a b l e n a m e = "ornek_user" i d = I n t e g e r 6 4 ( p r i m a r y k e y=true ) i s i m = Unicode (64) soyad = Unicode (64) Burada; # SQAlchemy Tablo N e s n e s i User. A t t r i b u t e s. s q l a t a b l e # SQAlchemy Mapper N e s n e s i User. A t t r i b u t e s. s q l a m a p p e r c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 50
Spyne & SQLAlchemy Yani tabloyu yaratmak için: metadata. c r e a t e a l l ( ) veya MyTableModel. A t t r i b u t e s. s q l a m e t a d a t a. c r e a t e a l l ( ) veya User. A t t r i b u t e s. s q l a t a b l e. c r e a t e ( ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 51
Spyne & SQLAlchemy 3) Artık bu nesneyi kullanan hizmetler yazabilirsiniz. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 52
Spyne ın SQLAlchemy Eklentileri Spyne ın karmaşık tanımlarını da veritabanına kolayca yazabilirsiniz c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 53
Spyne ın SQLAlchemy Eklentileri Şu iki nesne tanımına bakalım: c l a s s Perm ( MyTableModel ) : t a b l e n a m e = ornek_user_perm i d = I n t e g e r 3 2 ( p r i m a r y k e y=true ) app = Unicode (256) op = Unicode (256) c l a s s User ( MyTableModel ) : t a b l e n a m e = "ornek_user" i d = I n t e g e r 6 4 ( p r i m a r y k e y=true ) name = Unicode (128) perms = Array ( Perm ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 54
Buradaki Array yapısını tek bir kolondaki bir XML dokümanı olarak tutmak istersek: from spyne. model. complex import xml c l a s s User ( MyTableModel ) : t a b l e n a m e = "ornek_user" i d = I n t e g e r 6 4 ( p r i m a r y k e y=true ) name = Unicode (128) perms = Array ( Perm ). s t o r e a s ( xml ( no ns=true, r o o t t a g="p" ) ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 55
s e s s i o n. add ( User ( name="plq", perms =[Perm ( op= x, app= y ] ) ) INSERT INTO o r n e k u s e r ( name, perms ) VALUES ( plq, <p><perm ><op>x</op><app >y</app ></Perm > ) ; c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 56
Spyne ın SQLAlchemy Eklentileri Kendi tablosunda tutmak da isteyebiliriz: from spyne. model. complex import table c l a s s User ( MyTableModel ) : t a b l e n a m e = "ornek_user" i d = I n t e g e r 6 4 ( p r i m a r y k e y=true ) name = Unicode (128) perms = Array ( Perm ). s t o r e a s ( table ( ) ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 57
s e s s i o n. add ( User ( name="plq", perms =[Perm ( op= x, app= y ] ) ) INSERT INTO o r n e k u s e r ( name, perms ) VALUES ( plq ) ; INSERT INTO ornek perm ( op, app, o r n e k u s e r i d ) VALUES ( x, y, c u r r v a l ( ornek_user_id_seq ) ) ; c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 58
Servis örneği c l a s s UserManagerService ( S e r v i c e B a s e ) : @rpc ( User, r e t u r n s=i n t e g e r ) d e f a d d u s e r ( ctx, u s e r ) : c t x. udc. s e s s i o n. add ( u s e r ) c t x. udc. s e s s i o n. f l u s h ( ) r e t u r n u s e r. u s e r i d c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 59
Servis örneği Bu servisin kabul edeceği JSON dokümanı örneği: { User : { isim : Burak, soyad : Arslan, perms : [ { app : y, op : x }, { app : B, op : A } ], }} c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 60
Buraya kadar sorusu olan? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 61
İkincil Fonksiyonlar Spyne bağlamında; Bir çağrının cevabı istemciye döndürüldükten sonra çalıştırılan fonksiyonlara Auxiliary Method diyoruz. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 62
Servis örneğini hatırlayalım c l a s s UserManagerService ( S e r v i c e B a s e ) : @rpc ( User, r e t u r n s=i n t e g e r ) d e f a d d u s e r ( ctx, u s e r ) : c t x. udc. s e s s i o n. add ( u s e r ) c t x. udc. s e s s i o n. f l u s h ( ) r e t u r n u s e r. u s e r i d c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 63
İkincil fonksiyon örneği from spyne. auxproc. t h r e a d import ThreadAuxProc c l a s s UserManagerAuxService ( S e r v i c e B a s e ) : auxproc = ThreadAuxProc ( ) @rpc ( User, r e t u r n s=i n t e g e r ) d e f a d d u s e r ( ctx, u s e r ) : m a i l g o n d e r ( "Patron! Bir kullanicimiz " "daha oldu!" ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 64
İkincil fonksiyonun kullanılması İkincil fonksiyon, birincil fonksiyon sorunsuz dönüş yaptıktan sonra arka planda çağrılır. A p p l i c a t i o n ( [ UserManagerService, UserManagerAuxService, ], t n s= spyne.examples.multiprot, i n p r o t o c o l=httprpc ( ), o u t p r o t o c o l=soap11 ( ), ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 65
İkincil fonksiyonlar ile ilgili son sözler Bir fonksiyon aksi belirtilmedikçe birincildir. Tam bir tane birincil fonksiyon ve sıfır veya daha fazla ikincil fonksiyon olabilir. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 66
Buraya kadar sorusu olan? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 67
Spyne ı kullanmayı az çok öğrendik. Peki Spyne a nasıl katkıda bulunabiliriz? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 68
Spyne a Nasıl Katkıda Bulunabilirsiniz? 1. Protokol yazarak 2. Taşıyıcı yazarak 3. İkincil işleyici yazarak 4. Belge / Tutorial yazarak, tercüme yaparak. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 69
Spyne ile kendi protokollerinizi yazmak da çok kolay. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 70
Spyne ile kendi protokollerinizi yazmak da çok kolay. kesin öyledir c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 70
Örneğin, baştaki tarih ve saat örneğinde dönüş verisini akrep ve yelkovanı olan bir saat üzerinde göstermeye çalışalım. (fazla detaya girmeden tabii ki) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 71
Bunun için ProtocolBase alt sınıfında serialize ve create out string fonksiyonlarını yazmamız lazım. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 72
from l x m l import e t r e e from spyne. p r o t o c o l import P r o t o c o l B a s e c l a s s SvgClock ( P r o t o c o l B a s e ) : mime type = image/ svg+xml c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 73
from l x m l import e t r e e from spyne. p r o t o c o l import P r o t o c o l B a s e c l a s s SvgClock ( P r o t o c o l B a s e ) : mime type = image/ svg+xml d e f s e r i a l i z e ( s e l f, ctx, message ) : d e f c r e a t e o u t s t r i n g ( s e l f, ctx, c h a r s e t=none ) : c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 73
from l x m l import e t r e e from spyne. p r o t o c o l import P r o t o c o l B a s e c l a s s SvgClock ( P r o t o c o l B a s e ) : mime type = image/ svg+xml d e f s e r i a l i z e ( s e l f, ctx, message ) : d = c t x. o u t o b j e c t [ 0 ] # f o n k s i y o n d a n donen # d a t e t i m e n e s n e s i d e f c r e a t e o u t s t r i n g ( s e l f, ctx, c h a r s e t=none ) : c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 73
from l x m l import e t r e e from spyne. p r o t o c o l import P r o t o c o l B a s e c l a s s SvgClock ( P r o t o c o l B a s e ) : mime type = image/ svg+xml d e f s e r i a l i z e ( s e l f, ctx, message ) : d = c t x. o u t o b j e c t [ 0 ] # f o n k s i y o n d a n donen # d a t e t i m e n e s n e s i # ( detaya g i r m i y o r u z d e m i s t i k ) d e f c r e a t e o u t s t r i n g ( s e l f, ctx, c h a r s e t=none ) : c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 73
from l x m l import e t r e e from spyne. p r o t o c o l import P r o t o c o l B a s e c l a s s SvgClock ( P r o t o c o l B a s e ) : mime type = image/ svg+xml d e f s e r i a l i z e ( s e l f, ctx, message ) : d = c t x. o u t o b j e c t [ 0 ] # f o n k s i y o n d a n donen # d a t e t i m e n e s n e s i # ( detaya g i r m i y o r u z d e m i s t i k ) # c l o c k l x m l i n Element n e s n e s i o l a r a k t u t u l a n # b i r svg d o s y a s i c t x. out document = c l o c k d e f c r e a t e o u t s t r i n g ( s e l f, ctx, c h a r s e t=none ) : c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 73
from l x m l import e t r e e from spyne. p r o t o c o l import P r o t o c o l B a s e c l a s s SvgClock ( P r o t o c o l B a s e ) : mime type = image/ svg+xml d e f s e r i a l i z e ( s e l f, ctx, message ) : d = c t x. o u t o b j e c t [ 0 ] # f o n k s i y o n d a n donen # d a t e t i m e n e s n e s i # ( detaya g i r m i y o r u z d e m i s t i k ) # c l o c k l x m l i n Element n e s n e s i o l a r a k t u t u l a n # b i r svg d o s y a s i c t x. out document = c l o c k d e f c r e a t e o u t s t r i n g ( s e l f, ctx, c h a r s e t=none ) : c t x. o u t s t r i n g = [ e t r e e. t o s t r i n g ( c t x. out document ) ] c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 73
Bize özgü SVG protokolü: svg = A p p l i c a t i o n ( [ DateTimeService ], t n s= spyne.examples.multiprot, i n p r o t o c o l=httprpc ( ), o u t p r o t o c o l=svgclock ( ) ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 74
Bize özgü SVG protokolü: $ c u r l h t t p : / / l o c a l h o s t :9910/ g e t u t c t i m e \ > u t c t i m e. svg 2012-03-09 c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 75
Buraya kadar sorusu olan? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 76
Spyne da 10 çeşit taşıyıcı var: 1. İstemciler 10. Sunucular c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 77
İstemci taşıyıcısı Aşağıdaki gibi bir modül yazılması gerekli: c l a s s RemoteProcedure ( RemoteProcedureBase ) : d e f c a l l ( s e l f, args, kwargs ) : s e l f. c t x = s e l f. c o n t e x t s [ 0 ] s e l f. g e t o u t o b j e c t ( s e l f. ctx, args, kwargs ) s e l f. g e t o u t s t r i n g ( s e l f. c t x ) o u t s t r i n g =. j o i n ( s e l f. c t x. o u t s t r i n g ) # v e r i y i gonder # c e v a b i a l s e l f. c t x. i n s t r i n g = i n s t r i n g s e l f. g e t i n o b j e c t ( s e l f. c t x ) i f not ( s e l f. c t x. i n e r r o r i s None ) : r a i s e s e l f. c t x. i n e r r o r e l s e : r e t u r n s e l f. c t x. i n o b j e c t c l a s s BenimSuperIstemcim ( C l i e n t B a s e ) : d e f i n i t ( s e l f, u r l, app ) : C l i e n t B a s e. i n i t ( s e l f, u r l, app ) s e l f. s e r v i c e = S e r v i c e ( RemoteProcedure, u r l, app ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 78
İstemci taşıyıcısı bunu okumanız gerekmiyordu İstemci taşıyıcısı yazmak sunucu taşıyıcı yazmak ile kıyaslandığında çok daha basittir. Kaynak kod deposundaki örnekleri incelemek çok daha faydalı olur. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 79
Sunucu taşıyıcısı Sunucu taşıyıcıları için belirlenmiş bir api yok. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 80
Sunucu taşıyıcısı Sunucu taşıyıcıları için belirlenmiş bir api yok. Konu biraz karmaşık. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 80
Sunucu taşıyıcısı Yaptığı iş temelde şöyle: Giriş protokolüne istek bytestream ini gönderip istek nesnesini al. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 81
Sunucu taşıyıcısı Yaptığı iş temelde şöyle: Giriş protokolüne istek bytestream ini gönderip istek nesnesini al. Kullanıcı fonksiyonunu çalıştırıp dönen nesneyi al. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 81
Sunucu taşıyıcısı Yaptığı iş temelde şöyle: Giriş protokolüne istek bytestream ini gönderip istek nesnesini al. Kullanıcı fonksiyonunu çalıştırıp dönen nesneyi al. Bu nesneden çıkış protokolüne bytestream ürettirip bunu istemciye gönder. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 81
Sunucu taşıyıcısı Bu işi yapan bir taşıyıcı yazarken: (Eğer varsa) Sonsuz döngü çağrısının adının serve forever() olmasına, c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 82
Sunucu taşıyıcısı Bu işi yapan bir taşıyıcı yazarken: (Eğer varsa) Sonsuz döngü çağrısının adının serve forever() olmasına, Bütün concurrency yönetiminin burada yapılmasına, (Spyne kodunun geri kalanı reentrant olsa yeter.) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 82
Sunucu taşıyıcısı Bu işi yapan bir taşıyıcı yazarken: (Eğer varsa) Sonsuz döngü çağrısının adının serve forever() olmasına, Bütün concurrency yönetiminin burada yapılmasına, (Spyne kodunun geri kalanı reentrant olsa yeter.) Hangi isteğin arayüz dokümanı için, hangisinin RPC için olduğuna karar verilen kısmı unutmamaya c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 82
Sunucu taşıyıcısı Bu işi yapan bir taşıyıcı yazarken: (Eğer varsa) Sonsuz döngü çağrısının adının serve forever() olmasına, Bütün concurrency yönetiminin burada yapılmasına, (Spyne kodunun geri kalanı reentrant olsa yeter.) Hangi isteğin arayüz dokümanı için, hangisinin RPC için olduğuna karar verilen kısmı unutmamaya... dikkat ediyoruz. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 82
Buraya kadar sorusu olan? (itiraf etmek gerekirse bu bölümde yeteri kadar detaya girmedim) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 83
İkincil işleyici yazma konusunda ise; c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 84
İkincil işleyici yazma konusunda ise; apisi basit. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 84
İkincil İşleyici Yazmak (sadeleştirilmiş) ThreadAuxProc koduna bakalım: c l a s s ThreadAuxProc ( AuxProcBase ) : d e f p r o c e s s c o n t e x t ( s e l f, s e r v e r, ctx, args, kwargs ) : d e f i n i t i a l i z e ( s e l f, s e r v e r ) : c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 85
İkincil İşleyici Yazmak (sadeleştirilmiş) ThreadAuxProc koduna bakalım: c l a s s ThreadAuxProc ( AuxProcBase ) : d e f p r o c e s s c o n t e x t ( s e l f, s e r v e r, ctx, args, kwargs ) : s e l f. p o o l. a p p l y a s y n c ( s e l f. process, ( s e r v e r, c t x ) + args, kwargs ) d e f i n i t i a l i z e ( s e l f, s e r v e r ) : s e l f. p o o l = ThreadPool ( s e l f. p o o l s i z e ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 85
Bu konuda sorusu olan? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 86
Peki, (şu veya bu sebeple) kendi mesajlaşma ekosistemini yaratmak isteyenler XML ve çevresindeki teknolojilerden neler öğrenebilir? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 87
XML i yakından inceledikten sonra gördük ki... 1. Namespace desteği bir çok şeyi kolaylaştırıyor. 2. Nesne tanımlama dokümanı (XML Schema) tanımı yapılmalı. 3. Binary veri etkin taşınmalı. (Soap ın MTOM eklentisi) 4. (XMLSec) Kriptografik gizlilikte ve doğrulamada kullanılacak temel nesneler tanımlanmalı. Bu işlemleri (ve sıkıştırmayı da) out-of-band yapmamalı. 5. Kalıcı depolama formatı (EXI) ve sorgulama dili (XPath) tanımlamalı. 6. Mesaj yönlendirme ve RPC temel nesnelerini tanımlayın, API tanımlama standardı (WSDL) tanımlayın. Yönlendirme verisini eklemek için bütün mesajı işlemek gerekmesin! Bkz. email. c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 88
Geçmiş Olsun! umarım sizleri çok sıkmadım... c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 89
Eee, ne eksik? c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 90
Belge! c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 91
Belge! Belge! c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 92
Belge! Belge! Belge! c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 93
c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 94
Peki, başka ne eksik? Protokollerden: Taşıyıcılardan: İkincil İşleyicilerden: ProtoBuf! XmlRpc! Thrift! YAML! HTML! (Yani bütün sayfa) SMTP! Bildiğin Dosya! SPDY! WebSockets! Başka süreçte, hatta başka bilgisayarda işleme! ( ve daha bir sürü şey! Kaynak kod deposundaki ROADMAP.rst belgesine bir göz atabilirsiniz. ) c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 95
Daha fazla bilgi için: github.com/arskom/spyne Çoklu protokol: Doğrulama: Veritabanı: Örnekler examples/multiple protocols examples/validation.py examples/user manager/server sqlalchemy.py c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 96
Teşekkür Bu sunuma değerli yorumlarıyla katkıda bulunan aşağıdaki arkadaşlarıma çok teşekkür ederim: Alper Aydemir Gökberk Arslan Merve Ünlü Abdurrahman Yaşar c Arskom Ltd. - Özgür Web Teknolojileri Günleri - 19 Ekim 2012 97