Örvitinn

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

python
Athugasemdir

Eggert - 14/01/04 19:19 #

Flott dæmi. Hins vegar er rétt að benda á eitt. EinhverKlasi þarf að vera til á bæði client og server, og það sem meira er, module-an sem inniheldur hann þarf að heita það sama báðum megin. Hins vegar þarf ekki að vera um að ræða sama klasann....

Matti Á. - 14/01/04 19:43 #

Þú segir nokkuð, módúlan þarf að heita það sama, ég fattaði það ekki enda klasinn í aðal módúlu báðum megin hjá mér í þessu tilviki. Ég þurfti reyndar að keyra þetta einu sinni til að muna að klasinn þyrfti að vera til báðum megin :-)