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/
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/
本文深入探讨了使用Twisted框架实现异步响应的方法,包括延时响应、回调、错误处理、中断响应及访问日志配置。通过实例展示了如何在异步环境下处理HTTP请求,确保高效响应和用户体验。
1581

被折叠的 条评论
为什么被折叠?



