GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — python-doc-tw.github.io/library/asynchat.html at master · python-doc-tw/python-doc-tw.github.io Expand file tree/ Copy pathasynchat.htmlMore file actions 395 lines (359 loc) · 32.1 KB / Copy pathasynchat.htmlFile metadata and controls395 lines (359 loc) · 32.1 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="zh_TW"> <head> <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>19.7. asynchat — Asynchronous socket command/response handler — Python 3.7.0 說明文件</title> <link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script> <script type="text/javascript" src="../_static/jquery.js"></script> <script type="text/javascript" src="../_static/underscore.js"></script> <script type="text/javascript" src="../_static/doctools.js"></script> <script type="text/javascript" src="../_static/translations.js"></script> <script type="text/javascript" src="../_static/sidebar.js"></script> <link rel="search" type="application/opensearchdescription+xml" title="在 Python 3.7.0 說明文件 中搜尋" href="../_static/opensearch.xml"/> <link rel="author" title="關於這些文件" href="../about.html" /> <link rel="index" title="索引" href="../genindex.html" /> <link rel="search" title="搜尋" href="../search.html" /> <link rel="copyright" title="Copyright" href="../copyright.html" /> <link rel="next" title="19.8. signal — Set handlers for asynchronous events" href="signal.html" /> <link rel="prev" title="19.6. asyncore — Asynchronous socket handler" href="asyncore.html" /> <link rel="shortcut icon" type="image/png" href="../_static/py.png" /> <link rel="canonical" href="https://docs.python.org/3/library/asynchat.html" /> <script type="text/javascript" src="../_static/copybutton.js"></script> <script type="text/javascript" src="../_static/switchers.js"></script> </head><body> <div class="related" role="navigation" aria-label="related navigation"> <h3>瀏覽</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../genindex.html" title="General Index" accesskey="I">索引</a></li> <li class="right" > <a href="../py-modindex.html" title="Python 模組索引" >模組</a> |</li> <li class="right" > <a href="signal.html" title="19.8. signal — Set handlers for asynchronous events" accesskey="N">下一頁</a> |</li> <li class="right" > <a href="asyncore.html" title="19.6. asyncore — Asynchronous socket handler" accesskey="P">上一頁</a> |</li> <li><img src="../_static/py.png" alt="" style="vertical-align: middle; margin-top: -1px"/></li> <li><a href="https://www.python.org/">Python</a> »</li> <li> <span class="language_switcher_placeholder">zh_TW</span> <span class="version_switcher_placeholder">3.7.0</span> <a href="../index.html">Documentation </a> » </li> <li class="nav-item nav-item-1"><a href="index.html" >Python 標準函式庫 (Standard Library)</a> »</li> <li class="nav-item nav-item-2"><a href="ipc.html" accesskey="U">19. Interprocess Communication and Networking</a> »</li> <li class="right"> <div class="inline-search" style="display: none" role="search"> <form class="inline-search" action="../search.html" method="get"> <input placeholder="Quick search" type="text" name="q" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> <script type="text/javascript">$('.inline-search').show(0);</script> | </li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body" role="main"> <div class="section" id="module-asynchat"> <span id="asynchat-asynchronous-socket-command-response-handler"></span><h1>19.7. <a class="reference internal" href="#module-asynchat" title="asynchat: Support for asynchronous command/response protocols."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asynchat</span></code></a> — Asynchronous socket command/response handler<a class="headerlink" href="#module-asynchat" title="本標題的永久連結">¶</a></h1> <p><strong>Source code:</strong> <a class="reference external" href="https://github.com/python/cpython/tree/3.7/Lib/asynchat.py">Lib/asynchat.py</a></p> <div class="deprecated"> <p><span class="versionmodified">3.6 版後已棄用: </span>Please use <a class="reference internal" href="asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O, event loop, coroutines and tasks."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a> instead.</p> </div> <hr class="docutils" /> <div class="admonition note"> <p class="first admonition-title">備註</p> <p class="last">This module exists for backwards compatibility only. For new code we recommend using <a class="reference internal" href="asyncio.html#module-asyncio" title="asyncio: Asynchronous I/O, event loop, coroutines and tasks."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncio</span></code></a>.</p> </div> <p>This module builds on the <a class="reference internal" href="asyncore.html#module-asyncore" title="asyncore: A base class for developing asynchronous socket handling services."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncore</span></code></a> infrastructure, simplifying asynchronous clients and servers and making it easier to handle protocols whose elements are terminated by arbitrary strings, or are of variable length. <a class="reference internal" href="#module-asynchat" title="asynchat: Support for asynchronous command/response protocols."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asynchat</span></code></a> defines the abstract class <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a> that you subclass, providing implementations of the <code class="xref py py-meth docutils literal notranslate"><span class="pre">collect_incoming_data()</span></code> and <code class="xref py py-meth docutils literal notranslate"><span class="pre">found_terminator()</span></code> methods. It uses the same asynchronous loop as <a class="reference internal" href="asyncore.html#module-asyncore" title="asyncore: A base class for developing asynchronous socket handling services."><code class="xref py py-mod docutils literal notranslate"><span class="pre">asyncore</span></code></a>, and the two types of channel, <a class="reference internal" href="asyncore.html#asyncore.dispatcher" title="asyncore.dispatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncore.dispatcher</span></code></a> and <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">asynchat.async_chat</span></code></a>, can freely be mixed in the channel map. Typically an <a class="reference internal" href="asyncore.html#asyncore.dispatcher" title="asyncore.dispatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncore.dispatcher</span></code></a> server channel generates new <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">asynchat.async_chat</span></code></a> channel objects as it receives incoming connection requests.</p> <dl class="class"> <dt id="asynchat.async_chat"> <em class="property">class </em><code class="descclassname">asynchat.</code><code class="descname">async_chat</code><a class="headerlink" href="#asynchat.async_chat" title="本定義的永久連結">¶</a></dt> <dd><p>This class is an abstract subclass of <a class="reference internal" href="asyncore.html#asyncore.dispatcher" title="asyncore.dispatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncore.dispatcher</span></code></a>. To make practical use of the code you must subclass <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a>, providing meaningful <a class="reference internal" href="#asynchat.async_chat.collect_incoming_data" title="asynchat.async_chat.collect_incoming_data"><code class="xref py py-meth docutils literal notranslate"><span class="pre">collect_incoming_data()</span></code></a> and <a class="reference internal" href="#asynchat.async_chat.found_terminator" title="asynchat.async_chat.found_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">found_terminator()</span></code></a> methods. The <a class="reference internal" href="asyncore.html#asyncore.dispatcher" title="asyncore.dispatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncore.dispatcher</span></code></a> methods can be used, although not all make sense in a message/response context.</p> <p>Like <a class="reference internal" href="asyncore.html#asyncore.dispatcher" title="asyncore.dispatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncore.dispatcher</span></code></a>, <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a> defines a set of events that are generated by an analysis of socket conditions after a <code class="xref c c-func docutils literal notranslate"><span class="pre">select()</span></code> call. Once the polling loop has been started the <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a> object’s methods are called by the event-processing framework with no action on the part of the programmer.</p> <p>Two class attributes can be modified, to improve performance, or possibly even to conserve memory.</p> <dl class="data"> <dt id="asynchat.async_chat.ac_in_buffer_size"> <code class="descname">ac_in_buffer_size</code><a class="headerlink" href="#asynchat.async_chat.ac_in_buffer_size" title="本定義的永久連結">¶</a></dt> <dd><p>The asynchronous input buffer size (default <code class="docutils literal notranslate"><span class="pre">4096</span></code>).</p> </dd></dl> <dl class="data"> <dt id="asynchat.async_chat.ac_out_buffer_size"> <code class="descname">ac_out_buffer_size</code><a class="headerlink" href="#asynchat.async_chat.ac_out_buffer_size" title="本定義的永久連結">¶</a></dt> <dd><p>The asynchronous output buffer size (default <code class="docutils literal notranslate"><span class="pre">4096</span></code>).</p> </dd></dl> <p>Unlike <a class="reference internal" href="asyncore.html#asyncore.dispatcher" title="asyncore.dispatcher"><code class="xref py py-class docutils literal notranslate"><span class="pre">asyncore.dispatcher</span></code></a>, <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a> allows you to define a <abbr title="first-in, first-out">FIFO</abbr> queue of <em>producers</em>. A producer need have only one method, <code class="xref py py-meth docutils literal notranslate"><span class="pre">more()</span></code>, which should return data to be transmitted on the channel. The producer indicates exhaustion (<em>i.e.</em> that it contains no more data) by having its <code class="xref py py-meth docutils literal notranslate"><span class="pre">more()</span></code> method return the empty bytes object. At this point the <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a> object removes the producer from the queue and starts using the next producer, if any. When the producer queue is empty the <code class="xref py py-meth docutils literal notranslate"><span class="pre">handle_write()</span></code> method does nothing. You use the channel object’s <a class="reference internal" href="#asynchat.async_chat.set_terminator" title="asynchat.async_chat.set_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">set_terminator()</span></code></a> method to describe how to recognize the end of, or an important breakpoint in, an incoming transmission from the remote endpoint.</p> <p>To build a functioning <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a> subclass your input methods <a class="reference internal" href="#asynchat.async_chat.collect_incoming_data" title="asynchat.async_chat.collect_incoming_data"><code class="xref py py-meth docutils literal notranslate"><span class="pre">collect_incoming_data()</span></code></a> and <a class="reference internal" href="#asynchat.async_chat.found_terminator" title="asynchat.async_chat.found_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">found_terminator()</span></code></a> must handle the data that the channel receives asynchronously. The methods are described below.</p> </dd></dl> <dl class="method"> <dt id="asynchat.async_chat.close_when_done"> <code class="descclassname">async_chat.</code><code class="descname">close_when_done</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.close_when_done" title="本定義的永久連結">¶</a></dt> <dd><p>Pushes a <code class="docutils literal notranslate"><span class="pre">None</span></code> on to the producer queue. When this producer is popped off the queue it causes the channel to be closed.</p> </dd></dl> <dl class="method"> <dt id="asynchat.async_chat.collect_incoming_data"> <code class="descclassname">async_chat.</code><code class="descname">collect_incoming_data</code><span class="sig-paren">(</span><em>data</em><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.collect_incoming_data" title="本定義的永久連結">¶</a></dt> <dd><p>Called with <em>data</em> holding an arbitrary amount of received data. The default method, which must be overridden, raises a <a class="reference internal" href="exceptions.html#NotImplementedError" title="NotImplementedError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NotImplementedError</span></code></a> exception.</p> </dd></dl> <dl class="method"> <dt id="asynchat.async_chat.discard_buffers"> <code class="descclassname">async_chat.</code><code class="descname">discard_buffers</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.discard_buffers" title="本定義的永久連結">¶</a></dt> <dd><p>In emergencies this method will discard any data held in the input and/or output buffers and the producer queue.</p> </dd></dl> <dl class="method"> <dt id="asynchat.async_chat.found_terminator"> <code class="descclassname">async_chat.</code><code class="descname">found_terminator</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.found_terminator" title="本定義的永久連結">¶</a></dt> <dd><p>Called when the incoming data stream matches the termination condition set by <a class="reference internal" href="#asynchat.async_chat.set_terminator" title="asynchat.async_chat.set_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">set_terminator()</span></code></a>. The default method, which must be overridden, raises a <a class="reference internal" href="exceptions.html#NotImplementedError" title="NotImplementedError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NotImplementedError</span></code></a> exception. The buffered input data should be available via an instance attribute.</p> </dd></dl> <dl class="method"> <dt id="asynchat.async_chat.get_terminator"> <code class="descclassname">async_chat.</code><code class="descname">get_terminator</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.get_terminator" title="本定義的永久連結">¶</a></dt> <dd><p>Returns the current terminator for the channel.</p> </dd></dl> <dl class="method"> <dt id="asynchat.async_chat.push"> <code class="descclassname">async_chat.</code><code class="descname">push</code><span class="sig-paren">(</span><em>data</em><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.push" title="本定義的永久連結">¶</a></dt> <dd><p>Pushes data on to the channel’s queue to ensure its transmission. This is all you need to do to have the channel write the data out to the network, although it is possible to use your own producers in more complex schemes to implement encryption and chunking, for example.</p> </dd></dl> <dl class="method"> <dt id="asynchat.async_chat.push_with_producer"> <code class="descclassname">async_chat.</code><code class="descname">push_with_producer</code><span class="sig-paren">(</span><em>producer</em><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.push_with_producer" title="本定義的永久連結">¶</a></dt> <dd><p>Takes a producer object and adds it to the producer queue associated with the channel. When all currently-pushed producers have been exhausted the channel will consume this producer’s data by calling its <code class="xref py py-meth docutils literal notranslate"><span class="pre">more()</span></code> method and send the data to the remote endpoint.</p> </dd></dl> <dl class="method"> <dt id="asynchat.async_chat.set_terminator"> <code class="descclassname">async_chat.</code><code class="descname">set_terminator</code><span class="sig-paren">(</span><em>term</em><span class="sig-paren">)</span><a class="headerlink" href="#asynchat.async_chat.set_terminator" title="本定義的永久連結">¶</a></dt> <dd><p>Sets the terminating condition to be recognized on the channel. <code class="docutils literal notranslate"><span class="pre">term</span></code> may be any of three types of value, corresponding to three different ways to handle incoming protocol data.</p> <table border="1" class="docutils"> <colgroup> <col width="20%" /> <col width="80%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">term</th> <th class="head">描述</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td><em>string</em></td> <td>Will call <a class="reference internal" href="#asynchat.async_chat.found_terminator" title="asynchat.async_chat.found_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">found_terminator()</span></code></a> when the string is found in the input stream</td> </tr> <tr class="row-odd"><td><em>integer</em></td> <td>Will call <a class="reference internal" href="#asynchat.async_chat.found_terminator" title="asynchat.async_chat.found_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">found_terminator()</span></code></a> when the indicated number of characters have been received</td> </tr> <tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">None</span></code></td> <td>The channel continues to collect data forever</td> </tr> </tbody> </table> <p>Note that any data following the terminator will be available for reading by the channel after <a class="reference internal" href="#asynchat.async_chat.found_terminator" title="asynchat.async_chat.found_terminator"><code class="xref py py-meth docutils literal notranslate"><span class="pre">found_terminator()</span></code></a> is called.</p> </dd></dl> <div class="section" id="asynchat-example"> <span id="id1"></span><h2>19.7.1. asynchat Example<a class="headerlink" href="#asynchat-example" title="本標題的永久連結">¶</a></h2> <p>The following partial example shows how HTTP requests can be read with <a class="reference internal" href="#asynchat.async_chat" title="asynchat.async_chat"><code class="xref py py-class docutils literal notranslate"><span class="pre">async_chat</span></code></a>. A web server might create an <code class="xref py py-class docutils literal notranslate"><span class="pre">http_request_handler</span></code> object for each incoming client connection. Notice that initially the channel terminator is set to match the blank line at the end of the HTTP headers, and a flag indicates that the headers are being read.</p> <p>Once the headers have been read, if the request is of type POST (indicating that further data are present in the input stream) then the <code class="docutils literal notranslate"><span class="pre">Content-Length:</span></code> header is used to set a numeric terminator to read the right amount of data from the channel.</p> <p>The <code class="xref py py-meth docutils literal notranslate"><span class="pre">handle_request()</span></code> method is called once all relevant input has been marshalled, after setting the channel terminator to <code class="docutils literal notranslate"><span class="pre">None</span></code> to ensure that any extraneous data sent by the web client are ignored.</p> <div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">asynchat</span> <span class="k">class</span> <span class="nc">http_request_handler</span><span class="p">(</span><span class="n">asynchat</span><span class="o">.</span><span class="n">async_chat</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sock</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">sessions</span><span class="p">,</span> <span class="n">log</span><span class="p">):</span> <span class="n">asynchat</span><span class="o">.</span><span class="n">async_chat</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sock</span><span class="o">=</span><span class="n">sock</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">addr</span> <span class="o">=</span> <span class="n">addr</span> <span class="bp">self</span><span class="o">.</span><span class="n">sessions</span> <span class="o">=</span> <span class="n">sessions</span> <span class="bp">self</span><span class="o">.</span><span class="n">ibuffer</span> <span class="o">=</span> <span class="p">[]</span> <span class="bp">self</span><span class="o">.</span><span class="n">obuffer</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_terminator</span><span class="p">(</span><span class="sa">b</span><span class="s2">"</span><span class="se">\r\n\r\n</span><span class="s2">"</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">reading_headers</span> <span class="o">=</span> <span class="kc">True</span> <span class="bp">self</span><span class="o">.</span><span class="n">handling</span> <span class="o">=</span> <span class="kc">False</span> <span class="bp">self</span><span class="o">.</span><span class="n">cgi_data</span> <span class="o">=</span> <span class="kc">None</span> <span class="bp">self</span><span class="o">.</span><span class="n">log</span> <span class="o">=</span> <span class="n">log</span> <span class="k">def</span> <span class="nf">collect_incoming_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span> <span class="sd">"""Buffer the data"""</span> <span class="bp">self</span><span class="o">.</span><span class="n">ibuffer</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="k">def</span> <span class="nf">found_terminator</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">reading_headers</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">reading_headers</span> <span class="o">=</span> <span class="kc">False</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_headers</span><span class="p">(</span><span class="sa">b</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ibuffer</span><span class="p">))</span> <span class="bp">self</span><span class="o">.</span><span class="n">ibuffer</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">op</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="sa">b</span><span class="s2">"POST"</span><span class="p">:</span> <span class="n">clen</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">getheader</span><span class="p">(</span><span class="s2">"content-length"</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_terminator</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">clen</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">handling</span> <span class="o">=</span> <span class="kc">True</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_terminator</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_request</span><span class="p">()</span> <span class="k">elif</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">handling</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_terminator</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span> <span class="c1"># browsers sometimes over-send</span> <span class="bp">self</span><span class="o">.</span><span class="n">cgi_data</span> <span class="o">=</span> <span class="n">parse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">,</span> <span class="sa">b</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ibuffer</span><span class="p">))</span> <span class="bp">self</span><span class="o">.</span><span class="n">handling</span> <span class="o">=</span> <span class="kc">True</span> <span class="bp">self</span><span class="o">.</span><span class="n">ibuffer</span> <span class="o">=</span> <span class="p">[]</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_request</span><span class="p">()</span> </pre></div> </div> </div> </div> </div> </div> </div> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"> <h3><a href="../contents.html">目錄</a></h3> <ul> <li><a class="reference internal" href="#">19.7. <code class="docutils literal notranslate"><span class="pre">asynchat</span></code> — Asynchronous socket command/response handler</a><ul> <li><a class="reference internal" href="#asynchat-example">19.7.1. asynchat Example</a></li> </ul> </li> </ul> <h4>上個主題</h4> <p class="topless"><a href="asyncore.html" title="上一章">19.6. <code class="docutils literal notranslate"><span class="pre">asyncore</span></code> — Asynchronous socket handler</a></p> <h4>下個主題</h4> <p class="topless"><a href="signal.html" title="下一章">19.8. <code class="docutils literal notranslate"><span class="pre">signal</span></code> — Set handlers for asynchronous events</a></p> <div role="note" aria-label="source link"> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="../bugs.html">Report a Bug</a></li> <li> <a href="https://github.com/python/cpython/blob/3.7/Doc/library/asynchat.rst" rel="nofollow">Show Source </a> </li> </ul> </div> </div> </div> <div class="clearer"></div> </div> <div class="related" role="navigation" aria-label="related navigation"> <h3>瀏覽</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../genindex.html" title="General Index" >索引</a></li> <li class="right" > <a href="../py-modindex.html" title="Python 模組索引" >模組</a> |</li> <li class="right" > <a href="signal.html" title="19.8. signal — Set handlers for asynchronous events" >下一頁</a> |</li> <li class="right" > <a href="asyncore.html" title="19.6. asyncore — Asynchronous socket handler" >上一頁</a> |</li> <li><img src="../_static/py.png" alt="" style="vertical-align: middle; margin-top: -1px"/></li> <li><a href="https://www.python.org/">Python</a> »</li> <li> <span class="language_switcher_placeholder">zh_TW</span> <span class="version_switcher_placeholder">3.7.0</span> <a href="../index.html">Documentation </a> » </li> <li class="nav-item nav-item-1"><a href="index.html" >Python 標準函式庫 (Standard Library)</a> »</li> <li class="nav-item nav-item-2"><a href="ipc.html" >19. Interprocess Communication and Networking</a> »</li> <li class="right"> <div class="inline-search" style="display: none" role="search"> <form class="inline-search" action="../search.html" method="get"> <input placeholder="Quick search" type="text" name="q" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> <script type="text/javascript">$('.inline-search').show(0);</script> | </li> </ul> </div> <div class="footer"> © <a href="../copyright.html">Copyright</a> 2001-2018, Python Software Foundation. <br /> The Python Software Foundation is a non-profit corporation. <a href="https://www.python.org/psf/donations/">Please donate.</a> <br /> Last updated on 8月 22, 2018. <a href="../bugs.html">Found a bug</a>? <br /> Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.7.7. </div> </body> </html> |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |