Að senda gögn yfir vírinn í Python
Var að dunda mér fram á nótt við að skrifa lítið script til að streyma access_log skrána yfir http. Ég var áður búinn að skrifa cgi script til að skoða skrána beint, alla eða hluta hennar, en núna ákvað ég að skrifa forrit sem streymir gögnunum sem Python hlutum, mig langar nefnilega að skrifa client forrit sem sýnir mér hvað er í gangi á vefþjóninum og hægt er að nota í gegnum eldvegg. Svona client gæti að sjálfsögðu notast við sama cgi script og parsað htmlið, en mér finnst skemmtilegra að streyma gögnunum yfir sem lista af python hlutum. Að sjálfsögðu er til fullt af ókeypis lausnum sem gera svipaða hluti en ég er að skrifa þetta vegna þess að mér finnst það gaman!
Server forritið er afskaplega lítið og ómerkilegt, les access_log skrána og filterar út leitarvélar, botta og fyrirfram skilgreindar ip tölur (t.d. mínar). Með parameter get ég sagt hversu mikið ég vill að sé lesið úr skránni til að ekki sé sífellt verið að lesa hana alla. Næsta útgáfa mun geyma upplýsingar um hvað var síðast lesið og skila bara því sem er nýtt eða taka parameter sem tiltekur frá hvaða tíma við viljum lesa úr skránni.
Í Python er afskaplega einfalt að taka tilvik af klasa og umbreyta yfir í straum, til þess notar maður innbyggða pakkann pickle eða cPickle, sem er hraðvirkari en takmörkuð útgáfa af pickle.. Ég nota svo zlib til að þjappa gögnunum og base64 til að umbreyta þeim áður en ég sendi yfir vírinn.
# á server, EinhverKlasi er týpa sem við skilgreinum
# á server, getur verið listi, dictionary, set af klösum
# í raun hvað sem er
import pickle
import base64
import zlib
k = EinhverKlasi()
buffer = pickle.dumps(k)
buffer = zlib.compress(buffer)
buffer = base64.encodestring(buffer)
print buffer # í cgi scripti sendir þetta gögnin yfir á client
# á client, gögn sótt af vefþjón, URL vísar á cgi scriptið
import pickle
import base64
import zlib
import urllib2
buffer = urllib2.urlopen(URL).read()
buffer = base64.decodestring(buffer)
buffer = zlib.decompress(buffer)
k = pickle.loads(buffer)
# k inniheldur nú nákvæmlega sömu gögn og á server