[[Python]] NetworkProgramming 프레임워크 ([[HTTP]]뿐아니라 주요한 [[IP]]들을 거의 다 IoMultiplexing으로 구현할 수 있다.) http://twistedmatrix.com/products/twisted 이 프레임워크 안에 최근의 프로그램기법들이 녹아있다. * DesignPattern * AsynchronousProgramming * [[CBD]] Prerequisites * [[SSL]]/[[TLS]] : PyOpenSsl * Serial port : PySerial * [[SSH]] : PyCrypto (optional - PyPAM, GMPy, PyShadow) 최근, WebApplication templating 모듈로 쓰던 woven이 deprecated되고, [[Nevow]]가 사용된다. 관련자료 * IbmDeveloperWorks기사 [[http://www-106.ibm.com/developerworks/linux/library/l-twist1.html|Network programming with the Twisted framework]] * PyZine기사 [[http://www.pyzine.com/Issue006/Section_Articles/article_GettingTwisted.html|Getting Twisted - a Framework for writing Asynchronously Networked Applications]] * 관련개발자 [[Blog]]커뮤니티 : http://planet.twistedmatrix.com/ * TwistedNetworkProgrammingEssentials * [[http://www.ibm.com/developerworks/kr/library/opendw/20070529/|Twisted를 이용한 네트워크 서버 개발]] 관련포스트 * [[yong27/2004-06]]-11 * http://openlook.org/blog/python/0405TwistedMsn.html by [Perky] * http://blog.vrplumber.com/358 [[SSL]] 바인딩 및 [[Nevow]]사용자인증 예제 ---- === 궁금한것 === Q. === 관련 스크립트 === 외부프로세스를 비동기로 돌리기 --[[yong27]], 2004-11-12 {{{#!python import os from twisted.internet import reactor, utils myjob = dict() def doRepeatMasker(key, args): d=utils.getProcessOutput('RepeatMasker', args, {'PATH':os.environ['PATH']+':'+'/home/estin/bin'}) def gotOutput(output): print 'in call back...' print output myjob.pop(key) print ' after poped', myjob print 'end callback..' print ' myjob status :', myjob def gotError(failure): print 'in errback...' print failure print 'end errback...' d.addCallbacks(gotOutput, gotError) return d job1 = 'rp1', ['-cow', 'testseq'] job2 = 'rp2', ['-cow', 'testseq3'] print '--------------df1' print ' myjob status :', myjob df1 = doRepeatMasker(*job1) myjob['rp1'] = df1 print ' myjob status :', myjob print '--------------df2' print ' myjob status :', myjob df2 = doRepeatMasker(*job2) myjob['rp2'] = df2 print ' myjob status :', myjob reactor.run() }}} === 관련 팁 정리 === 의외로 유용한 문서가 없다. 홈페이지에 있는건 너무 개괄적. 직접적인 사용법을 이해하려면, 소스를 직접 봐야한다. 생각난김에 소스를 보며, 몰랐었던 사실들 정리. --[[yong27]], 2004-10-12 * twisted.enterprise.adbapi의 dbpool은 DB 커넥션수를 항상 언제나 3~5개로 유지한다. 갯수는 수정가능. * 함수값이 필요한 부분은 함수를 리턴한다. don't call us, we'll call you * row 객체를 써먹는 방법은 두가지. * db refector로부터 loadObjectsFrom(table명) 혹은, * 빈객체를 만들고 refector.insertRow * Deferred이해가 쉽지않다. 특히도, twisted내부 몇몇 함수들은 defer를 리턴하는데, 내가 필요한것은 값인데 뭔놈의 defer를 리턴하니,,, 좀 난감... 이를 이용하는 가장 간단한 방법은 다음과 같다. 특정 함수가 Deferred를 리턴하면, 값으로 기대되는 것을 인수로 받는 빈 함수를 만들고, 해당 defer에 addCallback 후, defer를 리턴한다. 혹은 nested function을 쓸수도 있다. 예제참고 {{{#!python def someFunction(): d = getDeferredFromSomeWhere() d.addCallback(gotValue) return d def gotValue(myExpect): return myExpect def someFunction2(): d = getDeferredFromSomeWhere() def gotValue(myExpect): return myExpect d.addCallback(gotValue) return d }}} * defer 에서 기대되는 값이 callback 되는 함수의 첫번째 인수로 사용된다는 사실은 중요하다. 만일 callback되는 함수가 인수를 받지 않도록 설계된다면 chain으로 연결되지 않고, async로 각각 따로 돌아간다. * rend.Page 를 상속받은 페이지객체에서, request를 가져오는 방법은 {{{request = inevow.IRequest(context)}}} * tags 의 속성에 class 를 넣고싶을 때, (즉, [[CSS]]를 적용하고 싶을 때) class 는 [[Python]]예약어라 syntax error. 이때 편법은 {{{#!python from nevow import tags as t newTable = t.table(**{'class':'mytable01'}) }}} * twisted.internet.utils 의 {{{getProcessOutput}}} 할때 주의사항. args에 WildCard가 사용될 수 없다. 정말이지 한참을 돌아돌아 알아낸 사실. 참고로 os.system()에서는 사용해도 이상없다. * euc-kr CharacterSet을 쓰고 싶으면, nevow/appserver.py 의 134라인의 setHeader부분을 euc-kr 로 수정 * 외부프로세스를 돌릴때, internet.utils.getProcessOutput 을 쓰게 되는데, 이 경우 stdin을 써먹을 수 없다. {{{protocol.ProcessProtocol}}} 을 상속받는 새로운 프로토콜을 만들고, reactor.spawnProcess 해야함. == 기타 == [[Twisted]]에서 deferred를 UnitTest하는 방법에 대해 질문하다. * [[http://bbs.python.or.kr/viewtopic.php?t=21645|파이썬 BBS]] * [[http://twistedmatrix.com/pipermail/twisted-python/2005-September/011533.html|Twisted maillist]] 몇몇 답변들이 있지만, 아직까지도 감이 안온다. -- [[yong27]] <> ---- CategoryProgramLibrary