Python Lover(8)Twisted Basic - async - logging

Python Lover(8)Twisted Basic - async - logging

1. Asynchronous Response
http://twistedmatrix.com/documents/current/web/howto/web-in-60/asynchronous.html

Basic Differences
We do not directly response string, we call Request.write. We can call request.write many times, after the entire response body has been passed to Request.write, the application must call Request.finish.

from twisted.web.resource import Resource
from twisted.web.server import NOT_DONE_YET
from twisted.internet import reactor

class DeplayedResource(Resource):
def _deplayedRender(self, request):
request.write("""
<html>
<body>
Sorry to keep you waiting.
</body>
</html>
""")

def render_GET(self, request):
reactor.callLater(5, self._deplayedRender, request) # delay 5 seconds
return NOT_DONE_YET

resource = DeplayedResource()

Command to start
> twistd -n web --path .

Visit this page to verify
http://localhost:8080/RestAPI.rpy

2. Deferred in AsyncResponse
http://twistedmatrix.com/documents/current/web/howto/web-in-60/asynchronous-deferred.html

Deferred provides callbacks and errbacks.
Deferred.addCallback Deferred.callback
Deferred.addErrback Deferred.errback

from twisted.internet.task import deferLater

from twisted.web.resource import Resource
from twisted.web.server import NOT_DONE_YET
from twisted.internet import reactor

class DelayedResource(Resource):
def _delayedRender(self, request):
request.write("""
<html>
<body>
Sorry to keep you waiting.
</body>
</html>
""")
request.finish()

def render_GET(self, request):
d = deferLater(reactor, 5, lambda : request)
d.addCallback(self._delayedRender)
return NOT_DONE_YET

resource = DelayedResource()

3. Interrupted Response
http://twistedmatrix.com/documents/current/web/howto/web-in-60/interrupted.html

Since we do async, sometimes, we have not finished generate the result, but the client connections are close, so we need to abandon the response generation entirely.

Cancel the Generation Process
from twisted.web.resource import Resource
from twisted.web.server import NOT_DONE_YET
from twisted.internet import reactor

class DelayedResource(Resource):
def _delayedRender(self,request):
request.write("""
<html>
<body>
Sorry to keep you waiting.
</body>
</html>
""")
request.finish()

def _responseFailed(self,err,call):
call.cancel()

def render_GET(self,request):
call = reactor.callLater(5, self._delayedRender, request)
request.notifyFinish().addErrback(self._responseFailed, call)
return NOT_DONE_YET

resource = DelayedResource()

4. Logging Error
http://twistedmatrix.com/documents/current/web/howto/web-in-60/logging-errors.html

from twisted.web.resource import Resource
from twisted.web.server import NOT_DONE_YET
from twisted.internet import reactor
from twisted.python.log import err

class DelayedResource(Resource):
def _delayedRender(self, request):
request.write("""
<html>
<body>
Sorry to keep you waiting.
</body>
</html>
""")
request.finish()

def _responseFailed(self, failure, call):
call.cancel()
err(failure,"Async response demo interrupted response")

def render_GET(self, request):
call = reactor.callLater(5, self._delayedRender, request)
request.notifyFinish().addErrback(self._responseFailed, call)
return NOT_DONE_YET

resource = DelayedResource()

These message will display when we cancel the client request.
2015-09-16 14:00:36-0500 [HTTPChannel,0,127.0.0.1] Async response demo interrupted response
Traceback (most recent call last):
Failure: twisted.internet.error.ConnectionDone: Connection was closed cleanly.


5. Access Logging
http://twistedmatrix.com/documents/current/web/howto/web-in-60/access-logging.html

We can configure the logging in 2 different ways.
factory = Site(root, logPath=b”/tmp/access-logging-demo.log”)

or

>twistd -n web - - logfile /tmp/access-logging-demo.log

> twistd -n web --path . --logfile ./RestAPI.access.log

References:
http://twistedmatrix.com/documents/15.0.0/core/howto/index.html
http://twistedmatrix.com/documents/current/web/howto/web-in-60/

deployment
http://twistedmatrix.com/trac/wiki/TwistedWeb
https://github.com/todddeluca/daemoncmd

https://bitbucket.org/tildeslash/monit/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值