<html xmlns="http://www.w3.org/1999/xhtml"><head><meta charset="utf-8"><meta name="generator" content="pdf2htmlEX"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><link rel="stylesheet" href="https://csdnimg.cn/release/download_crawler_static/css/base.min.css"><link rel="stylesheet" href="https://csdnimg.cn/release/download_crawler_static/css/fancy.min.css"><link rel="stylesheet" href="https://csdnimg.cn/release/download_crawler_static/10482660/raw.css"><script src="https://csdnimg.cn/release/download_crawler_static/js/compatibility.min.js"></script><script src="https://csdnimg.cn/release/download_crawler_static/js/pdf2htmlEX.min.js"></script><script>try{pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});}catch(e){}</script><title></title></head><body><div id="sidebar" style="display: none"><div id="outline"></div></div><div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/10482660/bg1.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0">816</div><div class="t m0 x2 h2 y2 ff1 fs0 fc1 sc0 ls0 ws0">This is the Title of the Book, eMatter Edition</div><div class="t m0 x3 h2 y3 ff1 fs0 fc1 sc0 ls0 ws0">Copyright © 2001 O’Reilly & Associates, Inc. All rights reserved.</div><div class="t m0 x4 h3 y4 ff2 fs1 fc1 sc0 ls0 ws0">Chapter<span class="_"> </span>14</div><div class="t m0 x5 h4 y5 ff2 fs2 fc0 sc0 ls1 ws0">14</div><div class="t m0 x1 h5 y6 ff1 fs3 fc0 sc0 ls0 ws0">Larg<span class="_ _0"></span>er W<span class="_ _1"></span>eb Site</div><div class="t m0 x1 h5 y7 ff1 fs3 fc0 sc0 ls0 ws0">Examples II</div><div class="t m0 x1 h6 y8 ff1 fs4 fc0 sc0 ls0 ws0">“T<span class="_ _0"></span>ypos Happen”</div><div class="t m0 x1 h3 y9 ff2 fs1 fc0 sc0 ls0 ws0">This<span class="_ _2"> </span>chapter<span class="_ _2"> </span>presents<span class="_ _2"> </span>the<span class="_ _2"> </span>second<span class="_ _2"> </span>of<span class="_ _2"> </span>two<span class="_ _2"> </span>server-side<span class="_ _2"> </span>Python<span class="_ _2"> </span>web<span class="_ _2"> </span>programming</div><div class="t m0 x1 h3 ya ff2 fs1 fc0 sc0 ls0 ws0">case<span class="_ _3"> </span>studies.<span class="_ _3"> </span>It<span class="_ _3"> </span>covers<span class="_ _3"> </span>the<span class="_ _3"> </span>design<span class="_ _3"> </span>and<span class="_ _3"> </span>implementation<span class="_ _3"> </span>of<span class="_ _3"> </span><span class="ff3">PyErrata</span>,<span class="_ _3"> </span>a<span class="_ _3"> </span>CGI-based</div><div class="t m0 x1 h3 yb ff2 fs1 fc0 sc0 ls0 ws0">web<span class="_ _4"> </span>site<span class="_ _4"> </span>implemented<span class="_ _4"> </span>entirely<span class="_ _4"> </span>in<span class="_ _4"> </span>Python<span class="_ _4"> </span>that<span class="_ _4"> </span>allows<span class="_ _4"> </span>users<span class="_ _4"> </span>to<span class="_ _4"> </span>post<span class="_ _4"> </span>book<span class="_ _4"> </span>comments</div><div class="t m0 x1 h3 yc ff2 fs1 fc0 sc0 ls0 ws0">and<span class="_ _3"> </span>error<span class="_ _3"> </span>reports,<span class="_ _5"> </span>and<span class="_ _5"> </span>demonstrates<span class="_ _3"> </span>the<span class="_ _3"> </span>concepts<span class="_ _5"> </span>underlying<span class="_ _3"> </span>persistent<span class="_ _3"> </span>database</div><div class="t m0 x1 h3 yd ff2 fs1 fc0 sc0 ls0 ws0">storage<span class="_ _3"> </span>in<span class="_ _3"> </span>the<span class="_ _3"> </span>CGI<span class="_ _3"> </span>world.<span class="_ _3"> </span>As<span class="_ _3"> </span>we’ll<span class="_ _3"> </span>see,<span class="_ _3"> </span>this<span class="_ _3"> </span>case<span class="_ _3"> </span>study<span class="_ _3"> </span>teaches<span class="_ _3"> </span>both<span class="_ _3"> </span>server-side</div><div class="t m0 x1 h3 ye ff2 fs1 fc0 sc0 ls0 ws0">scripting and Python development techniques.</div><div class="t m0 x1 h6 yf ff1 fs4 fc0 sc0 ls0 ws0">T<span class="_ _6"></span>he PyErr<span class="_ _7"></span>ata W<span class="_ _8"></span>eb Site</div><div class="t m0 x1 h3 y10 ff2 fs1 fc0 sc0 ls0 ws0">The<span class="_"> </span>last<span class="_ _4"> </span>chapter<span class="_"> </span>concluded<span class="_ _4"> </span>with<span class="_ _4"> </span>a<span class="_"> </span>discussion<span class="_ _4"> </span>of<span class="_"> </span>the<span class="_ _4"> </span>downsides<span class="_"> </span>of<span class="_ _4"> </span>deploying<span class="_ _4"> </span>appli-</div><div class="t m0 x1 h3 y11 ff2 fs1 fc0 sc0 ls0 ws0">cations<span class="_"> </span>on<span class="_ _4"> </span>the<span class="_"> </span>Web.<span class="_ _4"> </span>But<span class="_"> </span>now<span class="_"> </span>that<span class="_ _4"> </span>I’ve<span class="_"> </span>told<span class="_ _4"> </span>you<span class="_"> </span>all<span class="_ _4"> </span>the<span class="_"> </span>reasons<span class="_ _4"> </span>you<span class="_"> </span>might<span class="_ _4"> </span><span class="ff3">not<span class="_ _4"> </span></span>want</div><div class="t m0 x1 h3 y12 ff2 fs1 fc0 sc0 ls0 ws0">to<span class="_ _2"> </span>design<span class="_ _2"> </span>systems<span class="_ _2"> </span>for<span class="_ _2"> </span>the<span class="_ _2"> </span>Web,<span class="_ _2"> </span>I’m<span class="_ _2"> </span>going<span class="_ _9"> </span>to<span class="_ _9"> </span>completely<span class="_ _2"> </span>contradict<span class="_ _2"> </span>myself<span class="_ _2"> </span>and</div><div class="t m0 x1 h3 y13 ff2 fs1 fc0 sc0 ls0 ws0">present<span class="_ _4"> </span>a<span class="_ _a"> </span>system<span class="_ _4"> </span>that<span class="_ _a"> </span>cries<span class="_ _4"> </span>out<span class="_ _a"> </span>for<span class="_ _4"> </span>a<span class="_ _a"> </span>web-based<span class="_ _4"> </span>implementation.<span class="_ _a"> </span>This<span class="_ _4"> </span>chapter<span class="_ _a"> </span>pre-</div><div class="t m0 x1 h3 y14 ff2 fs1 fc0 sc0 ls0 ws0">sents<span class="_ _5"> </span>the<span class="_ _5"> </span>PyErrata<span class="_ _a"> </span>web<span class="_ _5"> </span>site,<span class="_ _5"> </span>a<span class="_ _5"> </span>Python<span class="_ _5"> </span>program<span class="_ _b"> </span>that<span class="_ _b"> </span>lets<span class="_ _5"> </span>arbitrary<span class="_ _5"> </span>people<span class="_ _b"> </span>on<span class="_ _5"> </span>arbi-</div><div class="t m0 x1 h3 y15 ff2 fs1 fc0 sc0 ls0 ws0">trary<span class="_ _2"> </span>machines<span class="_ _2"> </span>submit<span class="_ _c"> </span>book<span class="_ _2"> </span>comments<span class="_ _2"> </span>and<span class="_ _c"> </span>bug<span class="_ _2"> </span>reports<span class="_ _2"> </span>(usually<span class="_ _c"> </span>called<span class="_ _2"> </span><span class="ff3">errata</span>)</div><div class="t m0 x1 h3 y16 ff2 fs1 fc0 sc0 ls0 ws0">over the Web, using just a web browser.</div><div class="t m0 x1 h3 y17 ff2 fs1 fc0 sc0 ls0 ws0">PyErrata<span class="_ _b"> </span>is<span class="_ _b"> </span>in<span class="_ _b"> </span>some<span class="_ _b"> </span>ways<span class="_ _b"> </span>simpler<span class="_ _b"> </span>than<span class="_ _b"> </span>the<span class="_ _b"> </span>PyMailCgi<span class="_ _b"> </span>case<span class="_ _b"> </span>study<span class="_ _b"> </span>presented<span class="_ _b"> </span>in<span class="_ _b"> </span>the</div><div class="t m0 x1 h3 y18 ff2 fs1 fc0 sc0 ls0 ws0">previous<span class="_ _4"> </span>chapter.<span class="_ _4"> </span>From<span class="_ _4"> </span>a<span class="_ _4"> </span>user’s<span class="_ _4"> </span>perspective,<span class="_ _4"> </span>PyErrata<span class="_ _4"> </span>is<span class="_ _4"> </span>more<span class="_ _4"> </span>hierarchical<span class="_ _4"> </span>than<span class="_ _4"> </span>lin-</div><div class="t m0 x1 h3 y19 ff2 fs1 fc0 sc0 ls0 ws0">ear:<span class="_ _a"> </span>user<span class="_ _a"> </span>interactions<span class="_ _b"> </span>are<span class="_ _a"> </span>shorter<span class="_ _b"> </span>and<span class="_ _a"> </span>spawn<span class="_ _b"> </span>fewer<span class="_ _a"> </span>pages.<span class="_ _b"> </span>There<span class="_ _a"> </span>is<span class="_ _b"> </span>also<span class="_ _a"> </span>little<span class="_ _b"> </span>state</div><div class="t m0 x1 h3 y1a ff2 fs1 fc0 sc0 ls0 ws0">retention<span class="_ _a"> </span>in<span class="_ _a"> </span>web<span class="_ _a"> </span>pages<span class="_ _a"> </span>themselves<span class="_ _a"> </span>in<span class="_ _a"> </span>PyErrata;<span class="_ _b"> </span>URL<span class="_ _a"> </span>parameters<span class="_ _a"> </span>pass<span class="_ _a"> </span>state<span class="_ _a"> </span>in<span class="_ _a"> </span>only</div><div class="t m0 x1 h3 y1b ff2 fs1 fc0 sc0 ls0 ws0">one isolated case, and no hidden form fields are generated.</div><div class="t m0 x1 h3 y1c ff2 fs1 fc0 sc0 ls0 ws0">On<span class="_ _4"> </span>the<span class="_ _4"> </span>other<span class="_ _4"> </span>hand,<span class="_ _4"> </span>PyErrata<span class="_ _4"> </span>introduces<span class="_ _a"> </span>an<span class="_ _4"> </span>entirely<span class="_ _4"> </span>new<span class="_ _4"> </span>dimension:<span class="_ _4"> </span><span class="ff3">persistent<span class="_ _d"> </span>data</span></div><div class="t m0 x1 h3 y1d ff3 fs1 fc0 sc0 ls0 ws0">storage<span class="ff2">.<span class="_"> </span>State<span class="_ _4"> </span>(error<span class="_"> </span>and<span class="_ _4"> </span>comment<span class="_"> </span>reports)<span class="_ _4"> </span>is<span class="_"> </span>stored<span class="_ _4"> </span>permanently<span class="_"> </span>by<span class="_ _4"> </span>this<span class="_"> </span>system<span class="_ _4"> </span>on</span></div><div class="t m0 x6 h7 y1e ff4 fs5 fc0 sc0 ls0 ws0">,ch14.17404 Page 816 Wednesday, February 7, 2001 2:54 PM</div></div><div class="pi" data-data='{"ctm":[1.568627,0.000000,0.000000,1.568627,0.000000,0.000000]}'></div></div></body></html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/10482660/bg2.jpg"><div class="t m0 x1 h2 y1f ff1 fs0 fc0 sc0 ls0 ws0">The PyErrata Web Site<span class="_ _e"> </span>817</div><div class="t m0 x2 h2 y2 ff1 fs0 fc1 sc0 ls0 ws0">This is the Title of the Book, eMatter Edition</div><div class="t m0 x3 h2 y3 ff1 fs0 fc1 sc0 ls0 ws0">Copyright © 2001 O’Reilly & Associates, Inc. All rights reserved.</div><div class="t m0 x1 h3 y20 ff2 fs1 fc0 sc0 ls0 ws0">the<span class="_ _9"> </span>server,<span class="_ _9"> </span>either<span class="_ _9"> </span>in<span class="_ _2"> </span>flat<span class="_ _9"> </span>pickle<span class="_ _9"> </span>files<span class="_ _2"> </span>or<span class="_ _9"> </span>a<span class="_ _9"> </span>shelve-based<span class="_ _2"> </span>database.<span class="_ _9"> </span>Both<span class="_ _9"> </span>raise<span class="_ _9"> </span>the</div><div class="t m0 x1 h3 y21 ff2 fs1 fc0 sc0 ls0 ws0">specter<span class="_ _a"> </span>of<span class="_ _b"> </span>concurrent<span class="_ _b"> </span>updates,<span class="_ _b"> </span>since<span class="_ _b"> </span>any<span class="_ _b"> </span>number<span class="_ _b"> </span>of<span class="_ _b"> </span>users<span class="_ _a"> </span>out<span class="_ _b"> </span>in<span class="_ _b"> </span>cyberspace<span class="_ _b"> </span>may</div><div class="t m0 x1 h3 y22 ff2 fs1 fc0 sc0 ls0 ws0">be accessing the site at the same time.</div><div class="t m0 x1 h8 y23 ff1 fs6 fc0 sc0 ls0 ws0">System Goals</div><div class="t m0 x1 h3 y24 ff2 fs1 fc0 sc0 ls0 ws0">Before<span class="_ _4"> </span>you<span class="_ _4"> </span>ponder<span class="_ _4"> </span>too<span class="_ _a"> </span>long<span class="_ _4"> </span>over<span class="_ _4"> </span>the<span class="_ _4"> </span>seeming<span class="_ _a"> </span>paradox<span class="_ _4"> </span>of<span class="_ _4"> </span>a<span class="_ _4"> </span>book<span class="_ _4"> </span>that<span class="_ _a"> </span>comes<span class="_ _4"> </span>with</div><div class="t m0 x1 h3 y25 ff2 fs1 fc0 sc0 ls0 ws0">its<span class="_ _b"> </span>own<span class="_ _b"> </span>bug-reporting<span class="_ _b"> </span>system,<span class="_ _b"> </span>I<span class="_ _b"> </span>should<span class="_ _b"> </span>provide<span class="_ _b"> </span>a<span class="_ _b"> </span>little<span class="_ _b"> </span>background.<span class="_ _b"> </span>Over<span class="_ _b"> </span>the<span class="_ _b"> </span>last</div><div class="t m0 x1 h3 y26 ff2 fs1 fc0 sc0 ls0 ws0">five<span class="_ _b"> </span>years,<span class="_ _5"> </span>I’ve<span class="_ _b"> </span>been<span class="_ _b"> </span>fortunate<span class="_ _5"> </span>enough<span class="_ _b"> </span>to<span class="_ _5"> </span>have<span class="_ _b"> </span>had<span class="_ _5"> </span>the<span class="_ _b"> </span>opportunity<span class="_ _5"> </span>to<span class="_ _b"> </span>write<span class="_ _b"> </span>four</div><div class="t m0 x1 h3 y27 ff2 fs1 fc0 sc0 ls0 ws0">books,<span class="_ _9"> </span>a<span class="_ _2"> </span>large<span class="_ _9"> </span>chapter<span class="_ _2"> </span>in<span class="_ _9"> </span>a<span class="_ _2"> </span>reference<span class="_ _9"> </span>book,<span class="_ _2"> </span>and<span class="_ _9"> </span>various<span class="_ _2"> </span>magazine<span class="_ _9"> </span>articles<span class="_ _2"> </span>and</div><div class="t m0 x1 h3 y28 ff2 fs1 fc0 sc0 ls0 ws0">training<span class="_ _a"> </span>materials.<span class="_ _b"> </span>Changes<span class="_ _a"> </span>in<span class="_ _b"> </span>the<span class="_ _a"> </span>Python<span class="_ _b"> </span>world<span class="_ _a"> </span>have<span class="_ _b"> </span>also<span class="_ _b"> </span>provided<span class="_ _a"> </span>opportunities</div><div class="t m0 x1 h3 y29 ff2 fs1 fc0 sc0 ls0 ws0">to<span class="_ _b"> </span>rewrite<span class="_ _b"> </span>books<span class="_ _b"> </span>from<span class="_ _b"> </span>the<span class="_ _b"> </span>ground<span class="_ _b"> </span>up.<span class="_ _b"> </span>It’s<span class="_ _b"> </span>been<span class="_ _b"> </span>both<span class="_ _b"> </span>wildly<span class="_ _5"> </span>rewarding<span class="_ _a"> </span>and<span class="_ _5"> </span>lucra-</div><div class="t m0 x1 h3 y2a ff2 fs1 fc0 sc0 ls0 ws0">tive work (well, rewarding, at least).</div><div class="t m0 x1 h3 y2b ff2 fs1 fc0 sc0 ls0 ws0">But<span class="_ _a"> </span>one<span class="_ _b"> </span>of<span class="_ _b"> </span>the<span class="_ _b"> </span>first<span class="_ _b"> </span>big<span class="_ _b"> </span>lessons<span class="_ _b"> </span>one<span class="_ _b"> </span>learns<span class="_ _a"> </span>upon<span class="_ _b"> </span>initiation<span class="_ _b"> </span>in<span class="_ _b"> </span>the<span class="_ _b"> </span>publishing<span class="_ _b"> </span>busi-</div><div class="t m0 x1 h3 y2c ff2 fs1 fc0 sc0 ls0 ws0">ness<span class="_ _a"> </span>is<span class="_ _4"> </span>that<span class="_ _a"> </span>typos<span class="_ _a"> </span>are<span class="_ _a"> </span>a<span class="_ _4"> </span>fact<span class="_ _a"> </span>of<span class="_ _a"> </span>life.<span class="_ _a"> </span>Really.<span class="_ _a"> </span>No<span class="_ _4"> </span>matter<span class="_ _a"> </span>how<span class="_ _a"> </span>much<span class="_ _a"> </span>of<span class="_ _4"> </span>a<span class="_ _a"> </span>perfectionist</div><div class="t m0 x1 h3 y2d ff2 fs1 fc0 sc0 ls0 ws0">you<span class="_ _5"> </span>are,<span class="_ _b"> </span>books<span class="_ _5"> </span>will<span class="_ _5"> </span>have<span class="_ _5"> </span>bugs.<span class="_ _5"> </span>Furthermore,<span class="_ _5"> </span>big<span class="_ _5"> </span>books<span class="_ _b"> </span>tend<span class="_ _5"> </span>to<span class="_ _5"> </span>have<span class="_ _5"> </span>more<span class="_ _5"> </span>bugs</div><div class="t m0 x1 h3 y2e ff2 fs1 fc0 sc0 ls0 ws0">than<span class="_ _b"> </span>little<span class="_ _b"> </span>books,<span class="_ _b"> </span>and<span class="_ _b"> </span>in<span class="_ _5"> </span>the<span class="_ _b"> </span>technical<span class="_ _b"> </span>publishing<span class="_ _b"> </span>domain,<span class="_ _b"> </span>readers<span class="_ _b"> </span>are<span class="_ _5"> </span>often<span class="_ _b"> </span>suffi-</div><div class="t m0 x1 h3 y2f ff2 fs1 fc0 sc0 ls0 ws0">ciently savvy and motivated to send authors email when they find those bugs.</div><div class="t m0 x1 h3 y30 ff2 fs1 fc0 sc0 ls0 ws0">That’s<span class="_ _2"> </span>a<span class="_ _c"> </span>terrific<span class="_ _c"> </span>thing,<span class="_ _2"> </span>and<span class="_ _c"> </span>helps<span class="_ _c"> </span>authors<span class="_ _2"> </span>weed<span class="_ _c"> </span>out<span class="_ _c"> </span>typos<span class="_ _2"> </span>in<span class="_ _c"> </span>reprints.<span class="_ _c"> </span>I<span class="_ _2"> </span>always</div><div class="t m0 x1 h3 y31 ff2 fs1 fc0 sc0 ls0 ws0">encourage<span class="_ _4"> </span>and<span class="_ _4"> </span>appreciate<span class="_ _a"> </span>email<span class="_ _4"> </span>from<span class="_ _4"> </span>readers.<span class="_ _a"> </span>But<span class="_ _4"> </span>I<span class="_ _4"> </span>get<span class="_ _a"> </span>lots<span class="_ _4"> </span>of<span class="_ _4"> </span>email—at<span class="_ _4"> </span>times,<span class="_ _a"> </span>so</div><div class="t m0 x1 h3 y32 ff2 fs1 fc0 sc0 ls0 ws0">much<span class="_ _4"> </span>so<span class="_ _4"> </span>that<span class="_ _4"> </span>given<span class="_ _a"> </span>my<span class="_ _4"> </span>schedule,<span class="_ _4"> </span>I<span class="_ _4"> </span>find<span class="_ _a"> </span>it<span class="_ _4"> </span>difficult<span class="_ _4"> </span>to<span class="_ _4"> </span>even<span class="_ _4"> </span>reply<span class="_ _a"> </span>to<span class="_ _4"> </span>every<span class="_ _4"> </span>message,</div><div class="t m0 x1 h3 y33 ff2 fs1 fc0 sc0 ls0 ws0">let<span class="_"> </span>alone<span class="_"> </span>investigate<span class="_"> </span>and<span class="_"> </span>act<span class="_"> </span>on<span class="_ _4"> </span>every<span class="_"> </span>typo<span class="_"> </span>report.<span class="_"> </span>I<span class="_"> </span>get<span class="_"> </span>lots<span class="_ _4"> </span>of<span class="_"> </span>other<span class="_"> </span>email<span class="_"> </span>too,<span class="_"> </span>and</div><div class="t m0 x1 h3 y34 ff2 fs1 fc0 sc0 ls0 ws0">can miss a reader’s typo report if I’m not careful.</div><div class="t m0 x1 h3 y35 ff2 fs1 fc0 sc0 ls0 ws0">About<span class="_ _5"> </span>a<span class="_ _5"> </span>year<span class="_ _3"> </span>ago,<span class="_ _5"> </span>I<span class="_ _5"> </span>realized<span class="_ _3"> </span>that<span class="_ _5"> </span>I<span class="_ _5"> </span>just<span class="_ _3"> </span>couldn’t<span class="_ _5"> </span>keep<span class="_ _5"> </span>up<span class="_ _3"> </span>with<span class="_ _5"> </span>all<span class="_ _5"> </span>the<span class="_ _3"> </span>traffic<span class="_ _5"> </span>and</div><div class="t m0 x1 h3 y36 ff2 fs1 fc0 sc0 ls0 ws0">started<span class="_ _3"> </span>thinking<span class="_ _3"> </span>about<span class="_ _3"> </span>alternatives.<span class="_ _9"> </span>One<span class="_ _3"> </span>obvious<span class="_ _3"> </span>way<span class="_ _9"> </span>to<span class="_ _3"> </span>cut<span class="_ _3"> </span>down<span class="_ _9"> </span>on<span class="_ _3"> </span>the<span class="_ _3"> </span>over-</div><div class="t m0 x1 h3 y37 ff2 fs1 fc0 sc0 ls0 ws0">head<span class="_ _3"> </span>of<span class="_ _3"> </span>managing<span class="_ _3"> </span>reports<span class="_ _5"> </span>is<span class="_ _3"> </span>to<span class="_ _3"> </span>delegate<span class="_ _3"> </span>responsibility—to<span class="_ _3"> </span>offload<span class="_ _3"> </span>at<span class="_ _3"> </span>least<span class="_ _3"> </span>some</div><div class="t m0 x1 h3 y38 ff2 fs1 fc0 sc0 ls0 ws0">report-processing<span class="_ _a"> </span>tasks<span class="_ _a"> </span>to<span class="_ _a"> </span>the<span class="_ _b"> </span>people<span class="_ _a"> </span>who<span class="_ _a"> </span>generate<span class="_ _a"> </span>the<span class="_ _b"> </span>reports.<span class="_ _a"> </span>That<span class="_ _a"> </span>is,<span class="_ _b"> </span>I<span class="_ _a"> </span>needed</div><div class="t m0 x1 h3 y39 ff2 fs1 fc0 sc0 ls0 ws0">to<span class="_ _b"> </span>somehow<span class="_ _b"> </span>provide<span class="_ _b"> </span>a<span class="_ _b"> </span>widely<span class="_ _b"> </span>available<span class="_ _b"> </span>system,<span class="_ _b"> </span>separate<span class="_ _b"> </span>from<span class="_ _b"> </span>my<span class="_ _b"> </span>email<span class="_ _b"> </span>account,</div><div class="t m0 x1 h3 y3a ff2 fs1 fc0 sc0 ls0 ws0">that automates report posting and logs reports to be reviewed as time allows.</div><div class="t m0 x1 h3 y3b ff2 fs1 fc0 sc0 ls0 ws0">Of<span class="_ _a"> </span>course,<span class="_ _a"> </span>that’s<span class="_ _a"> </span>exactly<span class="_ _a"> </span>the<span class="_ _b"> </span>sort<span class="_ _a"> </span>of<span class="_ _a"> </span>need<span class="_ _a"> </span>that<span class="_ _a"> </span>the<span class="_ _b"> </span>Internet<span class="_ _a"> </span>is<span class="_ _a"> </span>geared<span class="_ _a"> </span>to.<span class="_ _b"> </span>By<span class="_ _a"> </span>imple-</div><div class="t m0 x1 h3 y3c ff2 fs1 fc0 sc0 ls0 ws0">menting<span class="_ _2"> </span>an<span class="_ _2"> </span>error-reporting<span class="_ _2"> </span>system<span class="_ _2"> </span>as<span class="_ _2"> </span>a<span class="_ _2"> </span>web<span class="_ _2"> </span>site,<span class="_ _2"> </span>any<span class="_ _2"> </span>reader<span class="_ _2"> </span>can<span class="_ _2"> </span>visit<span class="_ _c"> </span>and<span class="_ _2"> </span>log</div><div class="t m0 x1 h3 y3d ff2 fs1 fc0 sc0 ls0 ws0">reports<span class="_ _a"> </span>from<span class="_ _b"> </span>any<span class="_ _a"> </span>machine<span class="_ _b"> </span>with<span class="_ _a"> </span>a<span class="_ _b"> </span>browser,<span class="_ _a"> </span>whether<span class="_ _b"> </span>they<span class="_ _a"> </span>have<span class="_ _b"> </span>Python<span class="_ _b"> </span>installed<span class="_ _a"> </span>or</div><div class="t m0 x1 h3 y3e ff2 fs1 fc0 sc0 ls0 ws0">not.<span class="_ _a"> </span>Moreover,<span class="_ _4"> </span>those<span class="_ _a"> </span>reports<span class="_ _a"> </span>can<span class="_ _a"> </span>be<span class="_ _a"> </span>logged<span class="_ _a"> </span>in<span class="_ _4"> </span>a<span class="_ _a"> </span>database<span class="_ _a"> </span>at<span class="_ _a"> </span>the<span class="_ _a"> </span>web<span class="_ _4"> </span>site<span class="_ _a"> </span>for<span class="_ _a"> </span>later</div><div class="t m0 x1 h3 y3f ff2 fs1 fc0 sc0 ls0 ws0">inspection<span class="_"> </span>by<span class="_"> </span>both<span class="_"> </span>author<span class="_"> </span>and<span class="_ _4"> </span>readers,<span class="_"> </span>instead<span class="_"> </span>of<span class="_"> </span>requiring<span class="_"> </span>manual<span class="_"> </span>extraction<span class="_ _4"> </span>from</div><div class="t m0 x1 h3 y40 ff2 fs1 fc0 sc0 ls0 ws0">incoming email.</div><div class="t m0 x1 h3 y41 ff2 fs1 fc0 sc0 ls0 ws0">The<span class="_ _f"> </span>implementation<span class="_ _f"> </span>of<span class="_ _c"> </span>these<span class="_ _f"> </span>ideas<span class="_ _f"> </span>is<span class="_ _f"> </span>the<span class="_ _f"> </span>PyErrata<span class="_ _f"> </span>system—a<span class="_ _f"> </span>web<span class="_ _f"> </span>site<span class="_ _f"> </span>imple-</div><div class="t m0 x1 h3 y42 ff2 fs1 fc0 sc0 ls0 ws0">mented<span class="_ _9"> </span>with<span class="_ _2"> </span>server-side<span class="_ _2"> </span>Python<span class="_ _2"> </span>programs.<span class="_ _2"> </span>PyErrata<span class="_ _2"> </span>allows<span class="_ _2"> </span>readers<span class="_ _9"> </span>to<span class="_ _2"> </span>post<span class="_ _2"> </span>bug</div><div class="t m0 x1 h3 y43 ff2 fs1 fc0 sc0 ls0 ws0">reports<span class="_ _4"> </span>and<span class="_ _a"> </span>comments<span class="_ _4"> </span>about<span class="_ _a"> </span>this<span class="_ _4"> </span>edition<span class="_ _4"> </span>of<span class="_ _a"> </span><span class="ff3">Programming<span class="_ _d"> </span>Python</span>,<span class="_ _4"> </span>as<span class="_ _a"> </span>well<span class="_ _4"> </span>as<span class="_ _a"> </span>view</div><div class="t m0 x1 h3 y44 ff2 fs1 fc0 sc0 ls0 ws0">the<span class="_"> </span>collection<span class="_ _4"> </span>of<span class="_"> </span>all<span class="_ _4"> </span>prior<span class="_"> </span>posts<span class="_ _4"> </span>by<span class="_"> </span>various<span class="_ _4"> </span>sort<span class="_"> </span>keys.<span class="_ _4"> </span>Its<span class="_"> </span>goal<span class="_ _4"> </span>is<span class="_"> </span>to<span class="_ _4"> </span>replace<span class="_"> </span>the<span class="_ _4"> </span>tradi-</div><div class="t m0 x1 h3 y45 ff2 fs1 fc0 sc0 ls0 ws0">tional errata list pages I’ve had to maintain manually for other books in the past.</div><div class="t m0 x6 h7 y1e ff4 fs5 fc0 sc0 ls0 ws0">,ch14.17404 Page 817 Wednesday, February 7, 2001 2:54 PM</div></div><div class="pi" data-data='{"ctm":[1.568627,0.000000,0.000000,1.568627,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/10482660/bg3.jpg"><div class="t m0 x1 h2 y1f ff1 fs0 fc0 sc0 ls0 ws0">818<span class="_ _10"> </span>Chapter<span class="_"> </span>14: Larger Web Site Examples II</div><div class="t m0 x2 h2 y2 ff1 fs0 fc1 sc0 ls0 ws0">This is the Title of the Book, eMatter Edition</div><div class="t m0 x3 h2 y3 ff1 fs0 fc1 sc0 ls0 ws0">Copyright © 2001 O’Reilly & Associates, Inc. All rights reserved.</div><div class="t m0 x1 h3 y20 ff2 fs1 fc0 sc0 ls0 ws0">More<span class="_ _a"> </span>than<span class="_ _a"> </span>any<span class="_ _a"> </span>other<span class="_ _b"> </span>web-based<span class="_ _a"> </span>example<span class="_ _a"> </span>in<span class="_ _a"> </span>this<span class="_ _b"> </span>book,<span class="_ _a"> </span>PyErrata<span class="_ _a"> </span>demonstrates<span class="_ _a"> </span>just</div><div class="t m0 x1 h3 y21 ff2 fs1 fc0 sc0 ls0 ws0">how<span class="_ _a"> </span>much<span class="_ _b"> </span>work<span class="_ _a"> </span>can<span class="_ _b"> </span>be<span class="_ _b"> </span>saved<span class="_ _a"> </span>with<span class="_ _b"> </span>a<span class="_ _b"> </span>little<span class="_ _a"> </span>Internet<span class="_ _b"> </span>scripting.<span class="_ _b"> </span>To<span class="_ _a"> </span>support<span class="_ _b"> </span>the<span class="_ _b"> </span>first</div><div class="t m0 x1 h3 y22 ff2 fs1 fc0 sc0 ls0 ws0">edition<span class="_ _a"> </span>of<span class="_ _a"> </span>this<span class="_ _b"> </span>book,<span class="_ _a"> </span>I<span class="_ _b"> </span>hand-edited<span class="_ _a"> </span>an<span class="_ _a"> </span>HTML<span class="_ _b"> </span>file<span class="_ _a"> </span>that<span class="_ _b"> </span>listed<span class="_ _a"> </span>all<span class="_ _b"> </span>known<span class="_ _a"> </span>bugs.<span class="_ _a"> </span>With</div><div class="t m0 x1 h3 y46 ff2 fs1 fc0 sc0 ls0 ws0">PyErrata,<span class="_"> </span>server-side<span class="_ _4"> </span>programs<span class="_"> </span>generate<span class="_ _4"> </span>such<span class="_"> </span>pages<span class="_ _4"> </span>dynamically<span class="_ _4"> </span>from<span class="_"> </span>a<span class="_ _4"> </span>user-popu-</div><div class="t m0 x1 h3 y47 ff2 fs1 fc0 sc0 ls0 ws0">lated<span class="_ _9"> </span>database.<span class="_ _9"> </span>Because<span class="_ _9"> </span>list<span class="_ _9"> </span>pages<span class="_ _9"> </span>are<span class="_ _2"> </span>produced<span class="_ _9"> </span>on<span class="_ _9"> </span>demand,<span class="_ _9"> </span>PyErrata<span class="_ _9"> </span>not<span class="_ _9"> </span>only</div><div class="t m0 x1 h3 y48 ff2 fs1 fc0 sc0 ls0 ws0">publishes<span class="_"> </span>and<span class="_"> </span>automates<span class="_ _4"> </span>list<span class="_"> </span>creation,<span class="_"> </span>it<span class="_ _4"> </span>also<span class="_"> </span>provides<span class="_"> </span>multiple<span class="_ _4"> </span>ways<span class="_"> </span>to<span class="_"> </span>view<span class="_"> </span>report</div><div class="t m0 x1 h3 y49 ff2 fs1 fc0 sc0 ls0 ws0">data. I wouldn’t even try to reorder the first edition’s static HTML file list.</div><div class="t m0 x1 h3 y26 ff2 fs1 fc0 sc0 ls0 ws0">PyErrata<span class="_ _a"> </span>is<span class="_ _b"> </span>something<span class="_ _b"> </span>of<span class="_ _b"> </span>an<span class="_ _b"> </span>experiment<span class="_ _b"> </span>in<span class="_ _b"> </span>open<span class="_ _b"> </span>systems,<span class="_ _b"> </span>and<span class="_ _b"> </span>as<span class="_ _b"> </span>such<span class="_ _b"> </span>is<span class="_ _b"> </span>vulnera-</div><div class="t m0 x1 h3 y27 ff2 fs1 fc0 sc0 ls0 ws0">ble<span class="_ _a"> </span>to<span class="_ _b"> </span>abuse.<span class="_ _b"> </span>I<span class="_ _b"> </span>still<span class="_ _b"> </span>have<span class="_ _b"> </span>to<span class="_ _b"> </span>manually<span class="_ _b"> </span>investigate<span class="_ _b"> </span>reports,<span class="_ _b"> </span>as<span class="_ _b"> </span>time<span class="_ _b"> </span>allows.<span class="_ _b"> </span>But<span class="_ _b"> </span>it<span class="_ _b"> </span>at</div><div class="t m0 x1 h3 y28 ff2 fs1 fc0 sc0 ls0 ws0">least<span class="_ _a"> </span>has<span class="_ _4"> </span>the<span class="_ _a"> </span>potential<span class="_ _a"> </span>to<span class="_ _a"> </span>ease<span class="_ _a"> </span>one<span class="_ _a"> </span>of<span class="_ _4"> </span>the<span class="_ _a"> </span>chores<span class="_ _a"> </span>that<span class="_ _a"> </span>generally<span class="_ _a"> </span>goes<span class="_ _4"> </span>unmentioned</div><div class="t m0 x1 h3 y29 ff2 fs1 fc0 sc0 ls0 ws0">in typical publishing contracts.</div><div class="t m0 x1 h8 y4a ff1 fs6 fc0 sc0 ls0 ws0">Implementation Ov<span class="_ _7"></span>er<span class="_ _6"></span>view</div><div class="t m0 x1 h3 y4b ff2 fs1 fc0 sc0 ls0 ws0">Like<span class="_ _a"> </span>other<span class="_ _a"> </span>web-based<span class="_ _a"> </span>systems<span class="_ _b"> </span>in<span class="_ _a"> </span>this<span class="_ _a"> </span>part<span class="_ _b"> </span>of<span class="_ _a"> </span>the<span class="_ _a"> </span>book,<span class="_ _b"> </span>PyErrata<span class="_ _a"> </span>consists<span class="_ _a"> </span>of<span class="_ _b"> </span>a<span class="_ _a"> </span>col-</div><div class="t m0 x1 h3 y4c ff2 fs1 fc0 sc0 ls0 ws0">lection<span class="_ _b"> </span>of<span class="_ _5"> </span>HTML<span class="_ _5"> </span>files,<span class="_ _b"> </span>Python<span class="_ _5"> </span>utility<span class="_ _5"> </span>modules,<span class="_ _b"> </span>and<span class="_ _5"> </span>Python-coded<span class="_ _5"> </span>CGI<span class="_ _b"> </span>scripts<span class="_ _5"> </span>that</div><div class="t m0 x1 h3 y4d ff2 fs1 fc0 sc0 ls0 ws0">run<span class="_ _3"> </span>on<span class="_ _3"> </span>a<span class="_ _3"> </span>shared<span class="_ _3"> </span>server<span class="_ _3"> </span>instead<span class="_ _3"> </span>of<span class="_ _3"> </span>on<span class="_ _3"> </span>a<span class="_ _3"> </span>client.<span class="_ _3"> </span>Unlike<span class="_ _3"> </span>those<span class="_ _9"> </span>other<span class="_ _3"> </span>web<span class="_ _3"> </span>systems,</div><div class="t m0 x1 h3 y4e ff2 fs1 fc0 sc0 ls0 ws0">PyErrata<span class="_ _9"> </span>also<span class="_ _2"> </span>implements<span class="_ _2"> </span>a<span class="_ _2"> </span>persistent<span class="_ _2"> </span>database<span class="_ _9"> </span>and<span class="_ _2"> </span>defines<span class="_ _2"> </span>additional<span class="_ _2"> </span>directory</div><div class="t m0 x1 h3 y4f ff2 fs1 fc0 sc0 ls0 ws0">structures<span class="_ _a"> </span>to<span class="_ _b"> </span>support<span class="_ _a"> </span>it.<span class="_ _b"> </span>Figure<span class="_"> </span>14-1<span class="_ _b"> </span>shows<span class="_ _a"> </span>the<span class="_ _b"> </span>top-level<span class="_ _a"> </span>contents<span class="_ _b"> </span>of<span class="_ _b"> </span>the<span class="_ _a"> </span>site,<span class="_ _b"> </span>seen</div><div class="t m0 x1 h3 y50 ff2 fs1 fc0 sc0 ls0 ws0">on Windows from a PyEdit Open dialog.</div><div class="t m0 x1 h3 y51 ff2 fs1 fc0 sc0 ls0 ws0">You<span class="_ _4"> </span>will<span class="_ _4"> </span>find<span class="_ _4"> </span>a<span class="_ _4"> </span>similar<span class="_ _a"> </span>structure<span class="_ _4"> </span>on<span class="_ _4"> </span>this<span class="_ _4"> </span>book’s<span class="_ _4"> </span>CD-ROM.<span class="_ _4"> </span>To<span class="_ _4"> </span>install<span class="_ _a"> </span>this<span class="_ _4"> </span>site<span class="_ _4"> </span>on<span class="_ _4"> </span>the</div><div class="t m0 x1 h3 y52 ff2 fs1 fc0 sc0 ls0 ws0">Net,<span class="_ _a"> </span>all<span class="_ _a"> </span>the<span class="_ _a"> </span>files<span class="_ _a"> </span>and<span class="_ _a"> </span>directories<span class="_ _a"> </span>you<span class="_ _a"> </span>see<span class="_ _a"> </span>here<span class="_ _a"> </span>are<span class="_ _a"> </span>uploaded<span class="_ _a"> </span>to<span class="_ _a"> </span>the<span class="_ _a"> </span>server<span class="_ _a"> </span>machine</div><div class="t m0 x1 h3 y53 ff2 fs1 fc0 sc0 ls0 ws0">and<span class="_ _c"> </span>stored<span class="_ _c"> </span>in<span class="_ _c"> </span>a<span class="_ _f"> </span><span class="ff3">PyErrata<span class="_ _c"> </span></span>subdirectory<span class="_ _c"> </span>within<span class="_ _c"> </span>the<span class="_ _f"> </span>root<span class="_ _c"> </span>of<span class="_ _c"> </span>the<span class="_ _c"> </span>directory<span class="_ _c"> </span>that<span class="_ _f"> </span>is</div><div class="t m0 x1 h9 y54 ff3 fs0 fc0 sc0 ls0 ws0">Figure<span class="_"> </span>14-1.<span class="_"> </span>PyErrata site contents</div><div class="t m0 x6 h7 y1e ff4 fs5 fc0 sc0 ls0 ws0">,ch14.17404 Page 818 Wednesday, February 7, 2001 2:54 PM</div></div><div class="pi" data-data='{"ctm":[1.568627,0.000000,0.000000,1.568627,0.000000,0.000000]}'></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/10482660/bg4.jpg"><div class="t m0 x1 h2 y1f ff1 fs0 fc0 sc0 ls0 ws0">The PyErrata Web Site<span class="_ _e"> </span>819</div><div class="t m0 x2 h2 y2 ff1 fs0 fc1 sc0 ls0 ws0">This is the Title of the Book, eMatter Edition</div><div class="t m0 x3 h2 y3 ff1 fs0 fc1 sc0 ls0 ws0">Copyright © 2001 O’Reilly & Associates, Inc. All rights reserved.</div><div class="t m0 x1 h3 y20 ff2 fs1 fc0 sc0 ls0 ws0">exposed<span class="_ _9"> </span>to<span class="_ _9"> </span>the<span class="_ _2"> </span>Web<span class="_ _9"> </span>(my<span class="_ _2"> </span><span class="ff3">public_html<span class="_ _5"> </span></span>directory).<span class="_ _9"> </span>The<span class="_ _2"> </span>top-level<span class="_ _9"> </span>files<span class="_ _9"> </span>of<span class="_ _2"> </span>this<span class="_ _9"> </span>site</div><div class="t m0 x1 h3 y21 ff2 fs1 fc0 sc0 ls0 ws0">implement<span class="_ _3"> </span>browse<span class="_ _9"> </span>and<span class="_ _9"> </span>submit<span class="_ _3"> </span>operations<span class="_ _9"> </span>as<span class="_ _3"> </span>well<span class="_ _9"> </span>as<span class="_ _9"> </span>database<span class="_ _3"> </span>interfaces.<span class="_ _9"> </span>A<span class="_ _9"> </span>few</div><div class="t m0 x1 h3 y22 ff2 fs1 fc0 sc0 ls0 ws0">resource<span class="_ _4"> </span>page<span class="_ _a"> </span>files<span class="_ _a"> </span>and<span class="_ _a"> </span>images<span class="_ _4"> </span>show<span class="_ _a"> </span>up<span class="_ _a"> </span>in<span class="_ _4"> </span>this<span class="_ _a"> </span>listing<span class="_ _a"> </span>too,<span class="_ _a"> </span>but<span class="_ _4"> </span>are<span class="_ _a"> </span>ignored<span class="_ _a"> </span>in<span class="_ _4"> </span>this</div><div class="t m0 x1 h3 y46 ff2 fs1 fc0 sc0 ls0 ws0">book. Besides files, this site has subdirectories of its own:</div><div class="t m0 x1 h3 y55 ff2 fs1 fc0 sc0 ls0 ws0">•<span class="_ _11"> </span><span class="ff3">Mutex<span class="_ _9"> </span></span>is<span class="_ _2"> </span>a<span class="_ _9"> </span>Python<span class="_ _2"> </span>package<span class="_ _9"> </span>that<span class="_ _2"> </span>contains<span class="_ _9"> </span>a<span class="_ _2"> </span>mutual-exclusion<span class="_ _9"> </span>utility<span class="_ _2"> </span>module</div><div class="t m0 x7 h3 y24 ff2 fs1 fc0 sc0 ls0 ws0">used for shelves, as well as test scripts for this utility model.</div><div class="t m0 x1 h3 y56 ff2 fs1 fc0 sc0 ls0 ws0">•<span class="_ _11"> </span><span class="ff3">AdminTools<span class="_ _9"> </span></span>includes<span class="_ _9"> </span>system<span class="_ _2"> </span>utility<span class="_ _9"> </span>scripts<span class="_ _9"> </span>that<span class="_ _2"> </span>are<span class="_ _9"> </span>run<span class="_ _9"> </span>standalone<span class="_ _2"> </span>from<span class="_ _9"> </span>the</div><div class="t m0 x7 h3 y57 ff2 fs1 fc0 sc0 ls0 ws0">command line.</div><div class="t m0 x1 h3 y58 ff2 fs1 fc0 sc0 ls0 ws0">•<span class="_ _11"> </span><span class="ff3">DbaseFiles<span class="_ _12"> </span></span>holds<span class="_ _12"> </span>the<span class="_ _12"> </span>file-based<span class="_ _12"> </span>database,<span class="_ _12"> </span>with<span class="_ _12"> </span>separate<span class="_ _12"> </span>subdirectories<span class="_ _12"> </span>for</div><div class="t m0 x7 h3 y59 ff2 fs1 fc0 sc0 ls0 ws0">errata and comment pickle files.</div><div class="t m0 x1 h3 y5a ff2 fs1 fc0 sc0 ls0 ws0">•<span class="_ _11"> </span><span class="ff3">DbaseShelve<span class="_ _a"> </span></span>contains<span class="_ _a"> </span>the<span class="_ _4"> </span>shelve-based<span class="_ _a"> </span>database,<span class="_ _a"> </span>with<span class="_ _a"> </span>separate<span class="_ _a"> </span>shelve<span class="_ _a"> </span>files<span class="_ _a"> </span>for</div><div class="t m0 x7 h3 y5b ff2 fs1 fc0 sc0 ls0 ws0">errata and comments.</div><div class="t m0 x1 h3 y2c ff2 fs1 fc0 sc0 ls0 ws0">We’ll<span class="_ _a"> </span>meet<span class="_ _b"> </span>the<span class="_ _a"> </span>contents<span class="_ _b"> </span>of<span class="_ _b"> </span>the<span class="_ _a"> </span>database<span class="_ _b"> </span>subdirectories<span class="_ _a"> </span>later<span class="_ _b"> </span>in<span class="_ _b"> </span>this<span class="_ _a"> </span>chapter,<span class="_ _b"> </span>when</div><div class="t m0 x1 h3 y2d ff2 fs1 fc0 sc0 ls0 ws0">exploring the database implementation.</div><div class="t m0 x1 h8 y5c ff1 fs6 fc0 sc0 ls0 ws0">Pr<span class="_ _7"></span>esentation Str<span class="_ _7"></span>ateg<span class="_ _6"></span>y</div><div class="t m0 x1 h3 y5d ff2 fs1 fc0 sc0 ls0 ws0">PyErrata<span class="_ _3"> </span>takes<span class="_ _9"> </span>logic<span class="_ _9"> </span>factoring,<span class="_ _9"> </span>code<span class="_ _9"> </span>reuse,<span class="_ _9"> </span>and<span class="_ _9"> </span>encapsulation<span class="_ _9"> </span>to<span class="_ _9"> </span>extremes.<span class="_ _9"> </span>Top-</div><div class="t m0 x1 h3 y5e ff2 fs1 fc0 sc0 ls0 ws0">level<span class="_ _3"> </span>scripts,<span class="_ _3"> </span>for<span class="_ _3"> </span>example,<span class="_ _3"> </span>are<span class="_ _3"> </span>often<span class="_ _9"> </span>just<span class="_ _3"> </span>a<span class="_ _3"> </span>few<span class="_ _3"> </span>lines<span class="_ _3"> </span>long<span class="_ _9"> </span>and<span class="_ _3"> </span>ultimately<span class="_ _3"> </span>invoke</div><div class="t m0 x1 h3 y5f ff2 fs1 fc0 sc0 ls0 ws0">generic<span class="_ _a"> </span>logic<span class="_ _b"> </span>in<span class="_ _b"> </span>common<span class="_ _b"> </span>utility<span class="_ _a"> </span>modules.<span class="_ _b"> </span>With<span class="_ _b"> </span>such<span class="_ _b"> </span>an<span class="_ _a"> </span>architecture,<span class="_ _b"> </span>mixing<span class="_ _b"> </span>short</div><div class="t m0 x1 h3 y60 ff2 fs1 fc0 sc0 ls0 ws0">code<span class="_ _a"> </span>segments<span class="_ _b"> </span>with<span class="_ _b"> </span>lots<span class="_ _a"> </span>of<span class="_ _b"> </span>screen<span class="_ _b"> </span>shots<span class="_ _a"> </span>makes<span class="_ _b"> </span>it<span class="_ _b"> </span>tough<span class="_ _a"> </span>to<span class="_ _b"> </span>trace<span class="_ _b"> </span>the<span class="_ _b"> </span>flow<span class="_ _a"> </span>of<span class="_ _b"> </span>con-</div><div class="t m0 x1 h3 y61 ff2 fs1 fc0 sc0 ls0 ws0">trol through the program.</div><div class="t m0 x1 h3 y62 ff2 fs1 fc0 sc0 ls0 ws0">To<span class="_ _f"> </span>make<span class="_ _f"> </span>this<span class="_ _13"> </span>system<span class="_ _f"> </span>easier<span class="_ _f"> </span>to<span class="_ _13"> </span>study,<span class="_ _f"> </span>we’re<span class="_ _f"> </span>going<span class="_ _13"> </span>to<span class="_ _f"> </span>take<span class="_ _f"> </span>a<span class="_ _13"> </span>slightly<span class="_ _f"> </span>different</div><div class="t m0 x1 h3 y63 ff2 fs1 fc0 sc0 ls0 ws0">approach<span class="_ _4"> </span>here.<span class="_ _4"> </span>PyErrata’s<span class="_ _4"> </span>implementation<span class="_ _4"> </span>will<span class="_ _4"> </span>be<span class="_ _4"> </span>presented<span class="_ _4"> </span>in<span class="_ _4"> </span>three<span class="_ _4"> </span>main<span class="_ _4"> </span>sections</div><div class="t m0 x1 h3 y64 ff2 fs1 fc0 sc0 ls0 ws0">corresponding<span class="_ _9"> </span>to<span class="_ _2"> </span>major<span class="_ _2"> </span>functional<span class="_ _2"> </span>areas<span class="_ _2"> </span>of<span class="_ _2"> </span>the<span class="_ _2"> </span>system:<span class="_ _9"> </span>report<span class="_ _2"> </span>browsing,<span class="_ _2"> </span>report</div><div class="t m0 x1 h3 y65 ff2 fs1 fc0 sc0 ls0 ws0">submission,<span class="_"> </span>and<span class="_"> </span>database<span class="_"> </span>interfaces.<span class="_"> </span>The<span class="_"> </span>site<span class="_ _4"> </span>root<span class="_"> </span>page<span class="_"> </span>will<span class="_"> </span>be<span class="_"> </span>shown<span class="_"> </span>before<span class="_ _4"> </span>these</div><div class="t m0 x1 h3 y66 ff2 fs1 fc0 sc0 ls0 ws0">three sections, but mostly just for context; it’s simple, static HTML.</div><div class="t m0 x1 h3 y67 ff2 fs1 fc0 sc0 ls0 ws0">Within<span class="_ _2"> </span>the<span class="_ _2"> </span>browsing<span class="_ _2"> </span>and<span class="_ _c"> </span>submission<span class="_ _2"> </span>sections,<span class="_ _2"> </span>all<span class="_ _c"> </span>user<span class="_ _2"> </span>interaction<span class="_ _2"> </span>models<span class="_ _c"> </span>(and</div><div class="t m0 x1 h3 y68 ff2 fs1 fc0 sc0 ls0 ws0">screen<span class="_ _a"> </span>shots)<span class="_ _a"> </span>are<span class="_ _a"> </span>shown<span class="_ _b"> </span>first,<span class="_ _a"> </span>followed<span class="_ _a"> </span>by<span class="_ _b"> </span>all<span class="_ _a"> </span>the<span class="_ _a"> </span>source<span class="_ _a"> </span>code<span class="_ _b"> </span>used<span class="_ _a"> </span>to<span class="_ _a"> </span>implement</div><div class="t m0 x1 h3 y69 ff2 fs1 fc0 sc0 ls0 ws0">that<span class="_ _9"> </span>interaction.<span class="_ _9"> </span>Like<span class="_ _9"> </span>the<span class="_ _9"> </span>PyForm<span class="_ _9"> </span>example<span class="_ _9"> </span>in<span class="_ _9"> </span>Chapter<span class="_"> </span>16,<span class="_ _9"> </span><span class="ff3">Databases<span class="_ _b"> </span>and<span class="_ _5"> </span>Persis-</span></div><div class="t m0 x1 h3 y6a ff3 fs1 fc0 sc0 ls0 ws0">tence<span class="ff2">,<span class="_ _5"> </span>PyErrata<span class="_ _5"> </span>is<span class="_ _5"> </span>at<span class="_ _5"> </span>heart<span class="_ _5"> </span>a<span class="_ _5"> </span>database-access<span class="_ _5"> </span>program,<span class="_ _5"> </span>and<span class="_ _5"> </span>its<span class="_ _5"> </span>database<span class="_ _5"> </span>interfaces</span></div><div class="t m0 x1 h3 y6b ff2 fs1 fc0 sc0 ls0 ws0">are<span class="_ _5"> </span>ultimately<span class="_ _5"> </span>the<span class="_ _5"> </span>core<span class="_ _5"> </span>of<span class="_ _3"> </span>the<span class="_ _5"> </span>system.<span class="_ _5"> </span>Because<span class="_ _5"> </span>these<span class="_ _5"> </span>interfaces<span class="_ _3"> </span>encapsulate<span class="_ _5"> </span>most</div><div class="t m0 x1 h3 y6c ff2 fs1 fc0 sc0 ls0 ws0">low-level storage details, though, we’ll save their presentation for last.</div><div class="t m0 x1 h3 y6d ff2 fs1 fc0 sc0 ls0 ws0">Although<span class="_ _4"> </span>you<span class="_ _a"> </span>still<span class="_ _a"> </span>may<span class="_ _a"> </span>have<span class="_ _4"> </span>to<span class="_ _a"> </span>jump<span class="_ _a"> </span>around<span class="_ _4"> </span>some<span class="_ _a"> </span>to<span class="_ _a"> </span>locate<span class="_ _4"> </span>modules<span class="_ _a"> </span>across<span class="_ _a"> </span>func-</div><div class="t m0 x1 h3 y6e ff2 fs1 fc0 sc0 ls0 ws0">tional<span class="_ _4"> </span>boundaries,<span class="_ _4"> </span>this<span class="_ _4"> </span>organization<span class="_ _a"> </span>of<span class="_ _4"> </span>all<span class="_ _4"> </span>the<span class="_ _4"> </span>code<span class="_ _4"> </span>for<span class="_ _4"> </span>major<span class="_ _a"> </span>chunks<span class="_ _4"> </span>of<span class="_ _4"> </span>the<span class="_ _4"> </span>system</div><div class="t m0 x1 h3 y6f ff2 fs1 fc0 sc0 ls0 ws0">in their own sections should help minimize page-flipping.</div><div class="t m0 x6 h7 y1e ff4 fs5 fc0 sc0 ls0 ws0">,ch14.17404 Page 819 Wednesday, February 7, 2001 2:54 PM</div></div><div class="pi" data-data='{"ctm":[1.568627,0.000000,0.000000,1.568627,0.000000,0.000000]}'></div></div>
<div id="pf5" class="pf w0 h0" data-page-no="5"><div class="pc pc5 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/10482660/bg5.jpg"><div class="t m0 x1 h2 y1f ff1 fs0 fc0 sc0 ls0 ws0">820<span class="_ _10"> </span>Chapter<span class="_"> </span>14: Larger Web Site Examples II</div><div class="t m0 x2 h2 y2 ff1 fs0 fc1 sc0 ls0 ws0">This is the Title of the Book, eMatter Edition</div><div class="t m0 x3 h2 y3 ff1 fs0 fc1 sc0 ls0 ws0">Copyright © 2001 O’Reilly & Associates, Inc. All rights reserved.</div><div class="t m0 x1 h6 y70 ff1 fs4 fc0 sc0 ls0 ws0">T<span class="_ _6"></span>he Root P<span class="_ _14"></span>ag<span class="_ _7"></span>e</div><div class="t m0 x1 h3 y71 ff2 fs1 fc0 sc0 ls0 ws0">Let’s<span class="_ _4"> </span>start<span class="_ _4"> </span>at<span class="_ _4"> </span>the<span class="_ _4"> </span>top.<span class="_ _4"> </span>In<span class="_ _4"> </span>this<span class="_ _4"> </span>chapter<span class="_ _4"> </span>we<span class="_ _4"> </span>will<span class="_ _4"> </span>study<span class="_ _4"> </span>the<span class="_ _a"> </span>complete<span class="_ _4"> </span>implementation<span class="_ _4"> </span>of</div><div class="t m0 x1 h3 y72 ff2 fs1 fc0 sc0 ls0 ws0">PyErrata,<span class="_ _5"> </span>but<span class="_ _3"> </span>readers<span class="_ _3"> </span>are<span class="_ _5"> </span>also<span class="_ _3"> </span>encouraged<span class="_ _5"> </span>to<span class="_ _3"> </span>visit<span class="_ _3"> </span>the<span class="_ _5"> </span>web<span class="_ _3"> </span>site<span class="_ _3"> </span>where<span class="_ _5"> </span>it<span class="_ _3"> </span>lives<span class="_ _5"> </span>to</div><div class="t m0 x1 h3 y73 ff2 fs1 fc0 sc0 ls0 ws0">sample<span class="_ _4"> </span>the<span class="_ _a"> </span>flavor<span class="_ _4"> </span>of<span class="_ _4"> </span>its<span class="_ _a"> </span>interaction<span class="_ _4"> </span>first-hand.<span class="_ _4"> </span>Unlike<span class="_ _a"> </span>PyMailCgi,<span class="_ _4"> </span>there<span class="_ _4"> </span>are<span class="_ _a"> </span>no<span class="_ _4"> </span>pass-</div><div class="t m0 x1 h3 y74 ff2 fs1 fc0 sc0 ls0 ws0">word<span class="_"> </span>constraints<span class="_ _4"> </span>in<span class="_"> </span>PyErrata,<span class="_ _4"> </span>so<span class="_"> </span>you<span class="_ _4"> </span>can<span class="_"> </span>access<span class="_ _4"> </span>all<span class="_"> </span>of<span class="_ _4"> </span>its<span class="_"> </span>pages<span class="_ _4"> </span>without<span class="_"> </span>any<span class="_ _4"> </span>config-</div><div class="t m0 x1 h3 y75 ff2 fs1 fc0 sc0 ls0 ws0">uration steps.</div><div class="t m0 x1 h3 y76 ff2 fs1 fc0 sc0 ls0 ws0">PyErrata<span class="_ _b"> </span>installs<span class="_ _b"> </span>as<span class="_ _b"> </span>a<span class="_ _b"> </span>set<span class="_ _b"> </span>of<span class="_ _b"> </span>HTML<span class="_ _b"> </span>files<span class="_ _b"> </span>and<span class="_ _5"> </span>Python<span class="_ _b"> </span>CGI<span class="_ _b"> </span>scripts,<span class="_ _b"> </span>along<span class="_ _b"> </span>with<span class="_ _b"> </span>a<span class="_ _b"> </span>few</div><div class="t m0 x1 h3 y77 ff2 fs1 fc0 sc0 ls0 ws0">image<span class="_ _4"> </span>files.<span class="_ _4"> </span>As<span class="_ _4"> </span>usual,<span class="_ _4"> </span>you<span class="_ _4"> </span>can<span class="_ _4"> </span>simply<span class="_ _a"> </span>point<span class="_ _4"> </span>your<span class="_ _4"> </span>web<span class="_ _4"> </span>browser<span class="_ _4"> </span>to<span class="_ _4"> </span>the<span class="_ _4"> </span>system’s<span class="_ _4"> </span>root</div><div class="t m0 x1 h3 y78 ff2 fs1 fc0 sc0 ls0 ws0">page<span class="_ _b"> </span>to<span class="_ _5"> </span>run<span class="_ _b"> </span>the<span class="_ _5"> </span>system<span class="_ _b"> </span>live<span class="_ _5"> </span>while<span class="_ _b"> </span>you<span class="_ _5"> </span>study<span class="_ _b"> </span>this<span class="_ _5"> </span>chapter.<span class="_ _b"> </span>Its<span class="_ _5"> </span>root<span class="_ _b"> </span>page<span class="_ _5"> </span>currently</div><div class="t m0 x1 h3 y79 ff2 fs1 fc0 sc0 ls0 ws0">lives here:</div><div class="t m0 x8 ha y3d ff2 fs7 fc0 sc0 ls0 ws0">*</div><div class="t m0 x7 hb y7a ff3 fs1 fc0 sc0 ls0 ws0">http://starship.python.net/~lutz/PyErrata/pyerrata.html</div><div class="t m0 x1 h3 y7b ff2 fs1 fc0 sc0 ls0 ws0">If<span class="_ _13"> </span>you<span class="_ _12"> </span>go<span class="_ _13"> </span>to<span class="_ _13"> </span>this<span class="_ _12"> </span>address,<span class="_ _13"> </span>your<span class="_ _12"> </span>browser<span class="_ _13"> </span>will<span class="_ _13"> </span>be<span class="_ _12"> </span>served<span class="_ _13"> </span>the<span class="_ _12"> </span>page<span class="_ _13"> </span>shown<span class="_ _13"> </span>in</div><div class="t m0 x1 h3 y7c ff2 fs1 fc0 sc0 ls0 ws0">Figure<span class="_"> </span>14-2.<span class="_ _3"> </span>PyErrata<span class="_ _9"> </span>supports<span class="_ _9"> </span>both<span class="_ _9"> </span>submission<span class="_ _9"> </span>and<span class="_ _9"> </span>browsing<span class="_ _3"> </span>of<span class="_ _9"> </span>comments<span class="_ _9"> </span>and</div><div class="t m0 x9 h8 y7d ff1 fs6 fc0 sc0 ls0 ws0">Use the Sour<span class="_ _6"></span>ce, Luk<span class="_ _0"></span>e</div><div class="t m0 xa h3 y7e ff2 fs1 fc0 sc0 ls0 ws0">I<span class="_ _15"> </span>want<span class="_ _15"> </span>to<span class="_ _15"> </span>insert<span class="_ _15"> </span>the<span class="_ _15"> </span>standard<span class="_ _15"> </span>case-study<span class="_ _15"> </span>caveat<span class="_ _15"> </span>here:<span class="_ _15"> </span>although<span class="_ _15"> </span>this<span class="_ _15"> </span>chapter<span class="_ _15"> </span>does</div><div class="t m0 xa h3 y7f ff2 fs1 fc0 sc0 ls0 ws0">explain<span class="_ _a"> </span>major<span class="_ _a"> </span>concepts<span class="_ _a"> </span>along<span class="_ _a"> </span>the<span class="_ _a"> </span>way,<span class="_ _a"> </span>understanding<span class="_ _a"> </span>the<span class="_ _a"> </span>whole<span class="_ _a"> </span>story<span class="_ _a"> </span>is<span class="_ _a"> </span>left</div><div class="t m0 xa h3 y80 ff2 fs1 fc0 sc0 ls0 ws0">partly<span class="_ _15"> </span>up<span class="_ _16"> </span>to<span class="_ _16"> </span>you.<span class="_ _15"> </span>As<span class="_ _16"> </span>always,<span class="_ _15"> </span>please<span class="_ _16"> </span>consult<span class="_ _15"> </span>the<span class="_ _16"> </span>source<span class="_ _15"> </span>code<span class="_ _16"> </span>listings<span class="_ _15"> </span>in<span class="_ _16"> </span>this<span class="_ _15"> </span>chap-</div><div class="t m0 xa h3 y81 ff2 fs1 fc0 sc0 ls0 ws0">ter<span class="_ _15"> </span>(and<span class="_ _16"> </span>on<span class="_ _15"> </span>the<span class="_ _15"> </span>CD)<span class="_ _15"> </span>for<span class="_ _16"> </span>details<span class="_ _15"> </span>not<span class="_ _15"> </span>spelled<span class="_ _16"> </span>out<span class="_ _15"> </span>explicitly.<span class="_ _15"> </span>I’ve<span class="_ _15"> </span>taken<span class="_ _16"> </span>this<span class="_ _15"> </span>minimal</div><div class="t m0 xa h3 y82 ff2 fs1 fc0 sc0 ls0 ws0">approach<span class="_"> </span>deliberately,<span class="_ _15"> </span>mostly<span class="_"> </span>because<span class="_"> </span>I<span class="_ _d"> </span>assume<span class="_ _15"> </span>you<span class="_"> </span>already<span class="_"> </span>know<span class="_ _15"> </span>a<span class="_"> </span>lot<span class="_"> </span>about</div><div class="t m0 xa h3 y83 ff2 fs1 fc0 sc0 ls0 ws0">CGI<span class="_ _5"> </span>scripting<span class="_ _5"> </span>and<span class="_ _3"> </span>the<span class="_ _5"> </span>Python<span class="_ _5"> </span>language<span class="_ _5"> </span>by<span class="_ _3"> </span>this<span class="_ _5"> </span>point<span class="_ _5"> </span>in<span class="_ _3"> </span>the<span class="_ _5"> </span>book,<span class="_ _5"> </span>but<span class="_ _3"> </span>also</div><div class="t m0 xa h3 y84 ff2 fs1 fc0 sc0 ls0 ws0">because<span class="_"> </span>real-world<span class="_"> </span>development<span class="_"> </span>time<span class="_"> </span>is<span class="_ _d"> </span>spent<span class="_ _d"> </span>as<span class="_ _d"> </span>much<span class="_ _d"> </span>on<span class="_ _d"> </span>reading<span class="_ _15"> </span>other<span class="_"> </span>peo-</div><div class="t m0 xa h3 y85 ff2 fs1 fc0 sc0 ls0 ws0">ple’s<span class="_ _a"> </span>code<span class="_ _a"> </span>as<span class="_ _4"> </span>on<span class="_ _a"> </span>writing<span class="_ _a"> </span>your<span class="_ _a"> </span>own.<span class="_ _a"> </span>Python<span class="_ _a"> </span>makes<span class="_ _a"> </span>both<span class="_ _a"> </span>tasks<span class="_ _4"> </span>relatively<span class="_ _a"> </span>easy,</div><div class="t m0 xa h3 y86 ff2 fs1 fc0 sc0 ls0 ws0">but now is your chance to see how for yourself.</div><div class="t m0 xa h3 y87 ff2 fs1 fc0 sc0 ls0 ws0">I<span class="_"> </span>also<span class="_"> </span>wish<span class="_ _15"> </span>to<span class="_"> </span>confess<span class="_"> </span>right<span class="_"> </span>off<span class="_ _d"> </span>that<span class="_ _15"> </span>this<span class="_"> </span>chapter<span class="_"> </span>has<span class="_"> </span>a<span class="_"> </span>hidden<span class="_ _15"> </span>agenda.<span class="_"> </span>PyErrata</div><div class="t m0 xa h3 y88 ff2 fs1 fc0 sc0 ls0 ws0">not<span class="_ _d"> </span>only<span class="_ _15"> </span>shows<span class="_"> </span>more<span class="_ _15"> </span>server-side<span class="_"> </span>scripting<span class="_ _15"> </span>techniques,<span class="_"> </span>but<span class="_ _15"> </span>also<span class="_"> </span>illustrates<span class="_ _15"> </span>com-</div><div class="t m0 xa h3 y89 ff2 fs1 fc0 sc0 ls0 ws0">mon<span class="_"> </span>Python<span class="_ _4"> </span>development<span class="_"> </span>concepts<span class="_ _4"> </span>at<span class="_"> </span>large.<span class="_ _4"> </span>Along<span class="_"> </span>the<span class="_"> </span>way,<span class="_ _4"> </span>we<span class="_"> </span>focus<span class="_ _4"> </span>on<span class="_"> </span>this</div><div class="t m0 xa h3 y8a ff2 fs1 fc0 sc0 ls0 ws0">system’s<span class="_ _4"> </span>current<span class="_ _4"> </span>software<span class="_ _4"> </span>architecture<span class="_ _a"> </span>and<span class="_ _4"> </span>point<span class="_ _4"> </span>out<span class="_ _4"> </span>a<span class="_ _a"> </span>variety<span class="_ _4"> </span>of<span class="_ _4"> </span>design<span class="_ _4"> </span>alter-</div><div class="t m0 xa h3 y8b ff2 fs1 fc0 sc0 ls0 ws0">natives.<span class="_ _15"> </span>Be<span class="_"> </span>sure<span class="_ _15"> </span>to<span class="_"> </span>pay<span class="_ _15"> </span>special<span class="_ _15"> </span>attention<span class="_"> </span>to<span class="_ _15"> </span>the<span class="_"> </span>way<span class="_ _15"> </span>that<span class="_ _15"> </span>logic<span class="_"> </span>has<span class="_ _15"> </span>been<span class="_"> </span>layered</div><div class="t m0 xa h3 y2e ff2 fs1 fc0 sc0 ls0 ws0">into<span class="_ _15"> </span>multiple<span class="_"> </span>abstraction<span class="_ _15"> </span>levels.<span class="_ _15"> </span>For<span class="_ _d"> </span>example,<span class="_ _15"> </span>by<span class="_ _15"> </span>separating<span class="_"> </span>database<span class="_ _15"> </span>and<span class="_ _15"> </span>user-</div><div class="t m0 xa h3 y8c ff2 fs1 fc0 sc0 ls0 ws0">interface<span class="_ _b"> </span>(page<span class="_ _b"> </span>generation)<span class="_ _b"> </span>code,<span class="_ _b"> </span>we<span class="_ _b"> </span>minimize<span class="_ _5"> </span>code<span class="_ _b"> </span>redundancy<span class="_ _b"> </span>and<span class="_ _b"> </span>cross-</div><div class="t m0 xa h3 y8d ff2 fs1 fc0 sc0 ls0 ws0">module<span class="_ _a"> </span>dependencies<span class="_ _4"> </span>and<span class="_ _a"> </span>maximize<span class="_ _a"> </span>code<span class="_ _a"> </span>reuse.<span class="_ _a"> </span>Such<span class="_ _a"> </span>techniques<span class="_ _a"> </span>are<span class="_ _4"> </span>useful</div><div class="t m0 xa h3 y8e ff2 fs1 fc0 sc0 ls0 ws0">in all Python systems, web-based or not.</div><div class="t m0 x1 ha y8f ff2 fs7 fc0 sc0 ls0 ws0">*<span class="_ _d"> </span>But<span class="_ _d"> </span>be<span class="_ _d"> </span>sure<span class="_ _d"> </span>to<span class="_ _d"> </span>see<span class="_ _15"> </span>this<span class="_ _d"> </span>book’s<span class="_ _d"> </span>web<span class="_ _d"> </span>site,<span class="_ _d"> </span><span class="ff3">http://rmi.net/~lutz/about-pp.html</span>,<span class="_ _d"> </span>for<span class="_ _15"> </span>an<span class="_ _d"> </span>updated<span class="_ _d"> </span>link<span class="_ _d"> </span>if<span class="_ _d"> </span>the</div><div class="t m0 xb ha y90 ff2 fs7 fc0 sc0 ls0 ws0">one<span class="_"> </span>listed<span class="_ _d"> </span>here<span class="_"> </span>no<span class="_"> </span>longer<span class="_ _15"> </span>works<span class="_ _d"> </span>by<span class="_"> </span>the<span class="_"> </span>time<span class="_ _15"> </span>you<span class="_ _d"> </span>read<span class="_"> </span>this<span class="_"> </span>book.<span class="_ _15"> </span>Web<span class="_ _d"> </span>sites<span class="_"> </span>seem<span class="_"> </span>to<span class="_ _15"> </span>change<span class="_ _d"> </span>addresses</div><div class="t m0 xb ha y91 ff2 fs7 fc0 sc0 ls0 ws0">faster than developers change jobs.</div><div class="t m0 x6 h7 y1e ff4 fs5 fc0 sc0 ls0 ws0">,ch14.17404 Page 820 Wednesday, February 7, 2001 2:54 PM</div></div><div class="pi" data-data='{"ctm":[1.568627,0.000000,0.000000,1.568627,0.000000,0.000000]}'></div></div>