Vefþjónusta með Python

1 view
Skip to first unread message

ban...@bthj.is

unread,
Dec 6, 2007, 2:58:42 PM12/6/07
to Reykjavik Python User Group
Hæ;

Er ultra mega einfalt og fljótlegt að búa til vefþjónustu með Python?

Ástæða fyrir að ég spyr er að úti í horni er Windows vél sem hýsir
command-línuforrit sem þyrfti að vera hægt að kalla í frá öðrum
vélum. Úttak úr þessu forriti eru media skrár sem væri gott að fá
binary kóðaðar (Base64 líklegast) í vefþjónustusvari en URL væri
ásættanlegt svar ef binary er vesen.

Það sem ég hef fengist við undanfarið gerir Java (Axis + Tomcat)
augljósan kost en mér dettur í hug hvort þetta verkefni geti verið
heppilegt til að prófa Python?

Skoðanir á fýsileika Python í þessu tilfelli og gagnlegar vísanir eru
vel þegnar :)

/Björn

Arnar Birgisson

unread,
Dec 6, 2007, 3:27:03 PM12/6/07
to rp...@googlegroups.com
On Dec 6, 2007 7:58 PM, <ban...@bthj.is> wrote:
> Er ultra mega einfalt og fljótlegt að búa til vefþjónustu með Python?

Júbb, það er mjög lítið mál. Hvað áttu annars við með að "kalla úr
öðrum forritum"? Viltu SOAP vefþjónustu sem þú getur notað í Visual
Studio eða viltu bara vekja ákveðinn url með parametrum og fá til baka
base64 kóðun af skránum?

Ég hef skrifað töluvert af vefþjónustum sem eru bara methods exposed
sem urlar, parameter í query strengnum og svarið kemur til baka á JSON
formati (ekkert mál að velja output format).

Ég get dælt yfir þig linkum og einhverju af kóða kannski, en vil átta
mig betur á að hverju þú ert að leita :)

Arnar

ban...@bthj.is

unread,
Dec 6, 2007, 5:44:55 PM12/6/07
to Reykjavik Python User Group
Verkefnið snýst um að breyta videoskrá á einu sniði yfir á annað og
sennilega væri best að vefþjónustan tæki við SOAP kalli sem innihéldi
myndskeið á einu sniði ásamt parameter sem tilgreinir marksniðið,
vefþjónustan myndi vista myndskeiðið á local disk og kalla í
commandlínuforrit til að umbreyta því og skila úttakinu í SOAP svari.

URL-parametra-leiðin kemur örugglega líka til greina, þá myndi
vefþjónustan bara sækja og skila mediaskránum á tiltekna staði á neti.

Þetta er svolítil _sennilega/hugsanlega_ lýsing hjá mér þar sem ég var
bara rétt að frétta af verkefninu og ekki inn í smáatriðunum en strax
að velta fyrir mér Python leiðinni...

:)
/Björn

Arnar Birgisson

unread,
Dec 6, 2007, 6:03:28 PM12/6/07
to rp...@googlegroups.com
Sæll,

On Dec 6, 2007 10:44 PM, <ban...@bthj.is> wrote:
> Verkefnið snýst um að breyta videoskrá á einu sniði yfir á annað og
> sennilega væri best að vefþjónustan tæki við SOAP kalli sem innihéldi
> myndskeið á einu sniði ásamt parameter sem tilgreinir marksniðið,
> vefþjónustan myndi vista myndskeiðið á local disk og kalla í
> commandlínuforrit til að umbreyta því og skila úttakinu í SOAP svari.

Ok, kemurðu til með að nota þetta frá .NET forriti? Ef ekki, þá myndi
ég sneiða hjá SOAP, það er óþarflega flókin yfirbygging að mínu mati.

> URL-parametra-leiðin kemur örugglega líka til greina, þá myndi
> vefþjónustan bara sækja og skila mediaskránum á tiltekna staði á neti.

Ef þú ert að senda media skrá og fá svar til baka, gæti passað að
senda hana í POST body og fá svarið til baka (með réttri
content-týpu). Hvað eru þetta stórar skrár, tekur conversion dæmið það
stuttan tíma að þú getir svarað í sama HTTP requesti (ég myndi segja
innan við 5-10 sek)?

> Þetta er svolítil _sennilega/hugsanlega_ lýsing hjá mér þar sem ég var
> bara rétt að frétta af verkefninu og ekki inn í smáatriðunum en strax
> að velta fyrir mér Python leiðinni...

Ef það er um stórar skrár að ræða er ég ekki viss um að webservice sé
rétta tólið, nema það passi inní einhvern infrastrúktúr sem þú ert með
fyrir. Annars hentar Python ágætlega í svona límkóða.

Arnar

Einar Egilsson

unread,
Dec 6, 2007, 6:16:04 PM12/6/07
to rp...@googlegroups.com
Ein leið til að gera það sem Arnar talar um væri svona:

import tempfile, os
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class WSHandler(BaseHTTPRequestHandler):
   
    def do_GET(self):
        self.wfile.write('This can only be used with a POST request')
       
    def do_POST(self):
        input_bytes = self.rfile.read()
       
        tempfilename = tempfile.mktemp()
        tmpin = tempfilename + '.in'
        tmpout = tempfilename + '.out'
        format = self.path[1:]
       
        f = open(tmpin, 'wb')
        f.write(input_bytes)
        f.close()       

        result = os.system('converter.exe %s %s %s' % (format, tmpin, tmpout))
        #TODO: check result to see if it worked, or use os.popen if you need output stream
       
        f = open(tmpout, 'rb')
        output_bytes = f.read()
        f.close()
       
        self.send_response(200)
        self.send_header('Content-type', 'application/octet-stream')
        self.end_headers()

        self.wfile.write(output_bytes)
       

if __name__ == '__main__':
    try:
        server = HTTPServer(('', 8080), WSHandler)
        print 'started server...'
        server.serve_forever()
    except KeyboardInterrupt:
        print 'Received keyboard input, shutting down server'
        server.socket.close()


Þetta startar http server á porti 8080, tekur skrána úr request body-inu, tekur urlið sem parameter, t.d. ef þú mundir posta skránni á http://localhost:8080/jpeg þá væri 'jpeg' notað sem format parameter. Keyrir commandlínuforrit, les úttaksskrána og skrifar hana í response-ið. Skrifa hana beint, er ekkert að breyta í base64, það er óþarfi.

Þetta er bara einföld leið til að gera eitthvað svipað því sem þú ert að hugsa um. Ef þetta er mikilvægur partur af production kerfi þá væri gáfulegra að nota einhvern meiri alvöru vefþjón o.s.fv. en þetta ætti að virka.

kv.
Einar

Bjorn Swift

unread,
Dec 6, 2007, 6:18:53 PM12/6/07
to rp...@googlegroups.com
On 12/6/07, ban...@bthj.is <ban...@bthj.is> wrote:
> Verkefnið snýst um að breyta videoskrá á einu sniði yfir á annað og
> sennilega væri best að vefþjónustan tæki við SOAP kalli sem innihéldi
> myndskeið á einu sniði ásamt parameter sem tilgreinir marksniðið,
> vefþjónustan myndi vista myndskeiðið á local disk og kalla í
> commandlínuforrit til að umbreyta því og skila úttakinu í SOAP svari.

Hvernig verður þetta notað? Ég fékk það á tilfinninguna þegar ég las
fyrri póst þinn að þetta væri vél sem lægi úti í horni, og þá aðallega
notað af starfsmönnum á staðnum - er það misskilningur? Ef svo er gæti
verið overkill að búa til SOAP þjónustu sem tekur við myndskeiðinu
(sem gæti væntanlega verið nokkuð stórt?) og skilaði því umbreyttu -
hugsanlega nokkru síðar? Eftir að þessi SOAP þjónusta hefði verið
skrifuð þyrfti að skrifa eitthvað annað forrit, eða einhverja aðra
vefsíðu, sem gæti svo kallað á og nýtt sér hana - eða hvað?

> URL-parametra-leiðin kemur örugglega líka til greina, þá myndi
> vefþjónustan bara sækja og skila mediaskránum á tiltekna staði á neti.

Ef þetta er aðallega spurning um að spara starfsmönnum sporin að
tölvunni í horninu; hvað með (grf að allir hafi aðgang að vélinni yfir
netdrif):

* Notandi setur inn myndskeiðið foo.avi
* Notandi býr til tóma textaskrá sem heitir foo.avi.2mpg
* Lítil python lykkja pollar möppuna á x sek fresti og leitar að skrám
sem enda á 2eitthvað.
* Finnist slík skrá, t.d. foo.avi.2mpg er skránni foo.avi umbreytt í
mpg form og vistuð í foo.mpg
(( * Hugsanlega búin til textaskráin foo.mpg.done til að gefa til
kynna að allt hafi gengið upp og óhætt sé að afrita skránna af
vélinni. Sú skrá gæti t.d. innihaldið úttakið úr conversion forritinu,
hvað þetta tók langan tíma og eitthvað fleira skemmtilegt...))

Geri mér ekki alveg grein fyrir því hvernig þetta verður notað, en ef
þetta er hugsað fyrir fáeina starfsmenn þarf þetta ekki að vera síðri
lausn - mér þætti þetta amk þæginlegra en að nota vefsíðu - þótt þetta
eigi kannski ekki alveg við sé þetta ætlað fyrir stærri notendahóp ;)

Þetta mætti leysa í örfáum línum af kóða. Oft ágætt að byrja á
einföldustu lausninni og bæta hana svo síðar, ef þess þarf.

Aaaannyways - halda áfram að læra ;) !

Kveðja,
Björn Swift

Arnar Birgisson

unread,
Dec 6, 2007, 6:30:31 PM12/6/07
to rp...@googlegroups.com
Smá viðbót, það gæti verið gott að setja Content-Length header líka ef
gögnin eru stór og clientinn sem tekur við þessu er manneskja (gefur
þeim progress bar).

ban...@bthj.is

unread,
Dec 6, 2007, 8:26:18 PM12/6/07
to Reykjavik Python User Group
Takk allir - gagnlegar hugmyndir frá ykkur :)

Þessi fítus verður partur af stærra kerfi, Java forrit sem myndi kalla
í hann, og leiðin að senda skrána í POST body er held ég bara málið;
þetta eru ekki stórar skrár og umbreyting ætti að taka innan við tíu
sekúndur svo allt ætti að geta átt sér stað í einu HTTP requesti.

Kóðalínurnar sem Einar listar upp sýnist mér hreinlega afgreiða
málið. Þetta verður partur af production kerfi en það ætti ekki að
vera mikið álag á þessum hluta, innan við tylft umbreytinga á
klukkutíma myndi ég giska á, svo þessi vefþjónn gæti eflaust dugað ef
hann er stöðugur.

Það verða einhverjir dagar í að ég fæ tækifæri til að potast í þessu
en mig er þegar farið að hlakka til að prófa Python í það ;)

/Björn
> >http://localhost:8080/jpegþá væri 'jpeg' notað sem format parameter. Keyrir
> > commandlínuforrit, les úttaksskrána og skrifar hana í response-ið. Skrifa
> > hana beint, er ekkert að breyta í base64, það er óþarfi.
>
> > Þetta er bara einföld leið til að gera eitthvað svipað því sem þú ert að
> > hugsa um. Ef þetta er mikilvægur partur af production kerfi þá væri
> > gáfulegra að nota einhvern meiri alvöru vefþjón o.s.fv. en þetta ætti að
> > virka.
>
> > kv.
> > Einar
>

Dagur Ammendrup

unread,
Dec 7, 2007, 11:06:01 AM12/7/07
to rp...@googlegroups.com
Þú ættir klárlega að kíkja á Twisted: http://twistedmatrix.com/





On Dec 6, 2007 7:58 PM, <ban...@bthj.is > wrote:
Reply all
Reply to author
Forward
0 new messages