<div dir="ltr">Laurens,<br><br>> Cześć<br><br>Cześć! :) <br><br>Thank you for your answer. I'm explicitly interested in the following combination:<br><br>> .addCallback(cb).addErrback(eb)<br><br>If I understand correctly errback "eb" catches errors from both callback "cb", and from agent.request (agent.request errors pass through default empty errback that re-raises them).<br>
<p dir="ltr">> Also, if you want to do scraping with Twisted, consider looking at Scrapy, a fully-featured web scraper that uses Twisted internally.<br>
</p><p>I'm working on CoAP protocol which runs on top of UDP. My actual code is request processing (but the problem is the same as in my previous post):</p><p>_________________________________________________<br></p>
<div class="" id="LC716"><span style="font-family:courier new,monospace"><span class="">def</span> <span class="">processRequest</span><span class="">(</span><span class="">self</span><span class="">,</span> <span class="">request</span><span class="">):</span></span></div>
<span style="font-family:courier new,monospace">        (...)<br></span><div class="" id="LC729"><span style="font-family:courier new,monospace">        <span class="">d</span> <span class="">=</span> <span class="">defer</span><span class="">.</span><span class="">succeed</span><span class="">(</span><span class="">request</span><span class="">)</span></span></div>
<div class="" id="LC730"><span style="font-family:courier new,monospace">        <span class="">d</span><span class="">.</span><span class="">addCallback</span><span class="">(</span><span class="">self</span><span class="">.</span><span class="">processBlock1</span><span class="">)</span></span></div>
<div class="" id="LC731"><span style="font-family:courier new,monospace">        <span class="">d</span><span class="">.</span><span class="">addCallback</span><span class="">(</span><span class="">self</span><span class="">.</span><span class="">dispatchRequest</span><span class="">)</span></span></div>
<div class="" id="LC782"><span style="font-family:courier new,monospace"><span class="">def</span> <span class="">dispatchRequest</span><span class="">(</span><span class="">self</span><span class="">,</span> <span class="">request</span><span class="">):</span></span></div>
<div class="" id="LC783"><span style="font-family:courier new,monospace"><span class=""></span></span></div><span style="font-family:courier new,monospace">        (...)<br></span><div class="" id="LC786"><span style="font-family:courier new,monospace">        <span class="">resource</span> <span class="">=</span> <span class="">self</span><span class="">.</span><span class="">endpoint</span><span class="">.</span><span class="">getResourceFor</span><span class="">(</span><span class="">request</span><span class="">)</span></span></div>
<div class="" id="LC787"><span style="font-family:courier new,monospace">        <span class="">if</span> <span class="">resource</span> <span class="">is</span> <span class="">None</span><span class="">:</span></span></div>
<div class="" id="LC788"><span style="font-family:courier new,monospace">            <span class="">response</span> <span class="">=</span> <span class="">Message</span><span class="">(</span><span class="">code</span><span class="">=</span><span class="">NOT_FOUND</span><span class="">,</span> <span class="">payload</span><span class="">=</span><span class="">'Resource not found!'</span><span class="">)</span></span></div>
<div class="" id="LC789"><span style="font-family:courier new,monospace">            <span class="">self</span><span class="">.</span><span class="">respond</span><span class="">(</span><span class="">response</span><span class="">,</span> <span class="">request</span><span class="">)</span></span></div>
<div class="" id="LC790"><span style="font-family:courier new,monospace">            <span class="">return</span></span></div><div class="" id="LC791"><span style="font-family:courier new,monospace">        <span class="">try</span><span class="">:</span></span></div>
<div class="" id="LC792"><span style="font-family:courier new,monospace">            <span class="">d</span> <span class="">=</span> <span class="">resource</span><span class="">.</span><span class="">render</span><span class="">(</span><span class="">request</span><span class="">)</span></span></div>
<div class="" id="LC793"><span style="font-family:courier new,monospace">        <span class="">except</span> <span class="">iot</span><span class="">.</span><span class="">error</span><span class="">.</span><span class="">UnallowedMethod</span><span class="">:</span></span></div>
<div class="" id="LC794"><span style="font-family:courier new,monospace">            <span class="">response</span> <span class="">=</span> <span class="">Message</span><span class="">(</span><span class="">code</span><span class="">=</span><span class="">METHOD_NOT_ALLOWED</span><span class="">,</span> <span class="">payload</span><span class="">=</span><span class="">'Method not allowed!'</span><span class="">)</span></span></div>
<div class="" id="LC795"><span style="font-family:courier new,monospace">            <span class="">self</span><span class="">.</span><span class="">respond</span><span class="">(</span><span class="">response</span><span class="">,</span> <span class="">request</span><span class="">)</span></span></div>
<div class="" id="LC796"><span style="font-family:courier new,monospace">            <span class="">return</span></span></div><div class="" id="LC797"><span style="font-family:courier new,monospace">        <span class="">except</span> <span class="">iot</span><span class="">.</span><span class="">error</span><span class="">.</span><span class="">UnsupportedMethod</span><span class="">:</span></span></div>
<div class="" id="LC798"><span style="font-family:courier new,monospace">            <span class="">response</span> <span class="">=</span> <span class="">Message</span><span class="">(</span><span class="">code</span><span class="">=</span><span class="">NOT_IMPLEMENTED</span><span class="">,</span> <span class="">payload</span><span class="">=</span><span class="">'Method not implemented!'</span><span class="">)</span></span></div>
<div class="" id="LC799"><span style="font-family:courier new,monospace">            <span class="">self</span><span class="">.</span><span class="">respond</span><span class="">(</span><span class="">response</span><span class="">,</span> <span class="">request</span><span class="">)</span></span></div>
<div class="" id="LC800"><span style="font-family:courier new,monospace">            <span class="">return</span></span></div><div class="" id="LC801"><span style="font-family:courier new,monospace">        <span class="">delayed_ack</span> <span class="">=</span> <span class="">reactor</span><span class="">.</span><span class="">callLater</span><span class="">(</span><span class="">EMPTY_ACK_DELAY</span><span class="">,</span> <span class="">self</span><span class="">.</span><span class="">sendEmptyAck</span><span class="">,</span> <span class="">request</span><span class="">)</span></span></div>
<div class="" id="LC802"><span style="font-family:courier new,monospace">        <span class="">d</span><span class="">.</span><span class="">addCallback</span><span class="">(</span><span class="">self</span><span class="">.</span><span class="">respond</span><span class="">,</span> <span class="">request</span><span class="">,</span> <span class="">delayed_ack</span><span class="">)</span></span></div>
<div class="" id="LC803"><span style="font-family:courier new,monospace">        <span class="">return</span> <span class="">d</span></span></div><p dir="ltr">__________________________________________________<br></p><p>I would like to rewrite it to:</p>
<p>__________________________________________________<br></p><div class="" id="LC716"><span style="font-family:courier new,monospace"><span class="">def</span> <span class="">processRequest</span><span class="">(</span><span class="">self</span><span class="">,</span> <span class="">request</span><span class="">):</span></span></div>
<span style="font-family:courier new,monospace">        (...)<br></span><div class="" id="LC729"><span style="font-family:courier new,monospace">        <span class="">d</span> <span class="">=</span> <span class="">defer</span><span class="">.</span><span class="">succeed</span><span class="">(</span><span class="">request</span><span class="">)</span></span></div>
<div class="" id="LC730"><span style="font-family:courier new,monospace">        <span class="">d</span><span class="">.</span><span class="">addCallback</span><span class="">(</span><span class="">self</span><span class="">.</span><span class="">processBlock1</span><span class="">)</span></span></div>
<div class="" id="LC731"><span style="font-family:courier new,monospace">        <span class="">d</span><span class="">.</span><span class="">addCallback</span><span class="">(</span><span class="">self</span><span class="">.</span><span class="">dispatchRequest</span><span class="">).addErrback(self.handleRequestError)<br>
<br></span></span></div><div class="" id="LC782"><span style="font-family:courier new,monospace"><span class="">def</span> <span class="">dispatchRequest</span><span class="">(</span><span class="">self</span><span class="">,</span> <span class="">request</span><span class="">):</span></span></div>
<div class="" id="LC783"><span style="font-family:courier new,monospace"><span class=""></span></span></div><span style="font-family:courier new,monospace">        (...)<br></span><div class="" id="LC786"><span style="font-family:courier new,monospace">        <span class="">resource</span> <span class="">=</span> <span class="">self</span><span class="">.</span><span class="">endpoint</span><span class="">.</span><span class="">getResourceFor</span><span class="">(</span><span class="">request</span><span class="">)</span></span></div>
<div class="" id="LC787"><span style="font-family:courier new,monospace">        <span class="">if</span> <span class="">resource</span> <span class="">is</span> <span class="">None</span><span class="">:</span></span></div>
<div class="" id="LC788"><span style="font-family:courier new,monospace">            <span class="">raise NoResource()<br></span></span></div><div class="" id="LC791"><span style="font-family:courier new,monospace">        <span class="">try</span><span class="">:</span></span></div>
<div class="" id="LC792"><span style="font-family:courier new,monospace">            <span class="">d</span> <span class="">=</span> <span class="">resource</span><span class="">.</span><span class="">render</span><span class="">(</span><span class="">request</span><span class="">)</span></span></div>
<div class="" id="LC793"><span style="font-family:courier new,monospace">        <span class="">except</span> <span class="">iot</span><span class="">.</span><span class="">error</span><span class="">.</span><span class="">UnallowedMethod</span><span class="">:      #Explicit re-rise for this example only<br>
</span></span></div><div class="" id="LC794"><span style="font-family:courier new,monospace">            <span class="">raise </span><span class=""><span class=""></span><span class="">UnallowedMethod</span><span class=""></span>()              <br>
</span></span></div><div class="" id="LC797"><span style="font-family:courier new,monospace">        <span class="">except</span> <span class="">iot</span><span class="">.</span><span class="">error</span><span class="">.</span><span class="">UnsupportedMethod</span><span class="">:</span></span></div>
<div class="" id="LC798"><span style="font-family:courier new,monospace">            <span class="">raise </span><span class=""><span class=""></span><span class="">UnsupportedMethod</span><span class=""></span>()<br></span></span></div>
<div class="" id="LC801"><span style="font-family:courier new,monospace"><span class=""></span></span></div><div class="" id="LC802"><span style="font-family:courier new,monospace">        <span class="">d</span><span class="">.</span><span class="">addCallback</span><span class="">(</span><span class="">self</span><span class="">.</span><span class="">respond</span><span class="">,</span> <span class="">request</span><span class=""></span><span class="">)</span></span></div>
<div class="" id="LC803"><span style="font-family:courier new,monospace">        <span class="">return</span> </span><span class=""><span style="font-family:courier new,monospace">d</span><br><br></span><br><span style="font-family:courier new,monospace"><span class="">def handleRequestErrors(self, failure, request???)<br>
</span></span></div><div class="" id="LC803"><span style="font-family:courier new,monospace"><span class="">        # handle exceptions, send error response to client<br></span></span></div><p dir="ltr">_______________________________________________</p>
<p>I would like to handle Exceptions in handleRequestErrors(). However handleRequestErrors() has to send a response to the client, so it needs the request, and I don't know how to pass it from inside dispatchRequest().</p>
<p>I see two possibilities:<br>    1. Pass request inside Failure object<br>    2. Leave the original code (process errors inside callback)<br><br>Which solution is more elegant?</p><p dir="ltr"></p><p>Best Regards</p><p>
Maciek<br>
</p>
</div>