PageRenderTime 45ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/docs/_build/html/index.html

https://github.com/wwq0327/flask-simple-todo
HTML | 612 lines | 607 code | 5 blank | 0 comment | 0 complexity | 7aa28b73c50ed33c77a5d1bc1d724c8e MD5 | raw file
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>Welcome to Todo for Flasks documentation! &mdash; flask-simple-todo v0.1 documentation</title>
  7. <link rel="stylesheet" href="_static/nature.css" type="text/css" />
  8. <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
  9. <script type="text/javascript">
  10. var DOCUMENTATION_OPTIONS = {
  11. URL_ROOT: '',
  12. VERSION: '0.1',
  13. COLLAPSE_INDEX: false,
  14. FILE_SUFFIX: '.html',
  15. HAS_SOURCE: true
  16. };
  17. </script>
  18. <script type="text/javascript" src="_static/jquery.js"></script>
  19. <script type="text/javascript" src="_static/underscore.js"></script>
  20. <script type="text/javascript" src="_static/doctools.js"></script>
  21. <link rel="top" title="flask-simple-todo v0.1 documentation" href="#" />
  22. </head>
  23. <body>
  24. <div class="related">
  25. <h3>Navigation</h3>
  26. <ul>
  27. <li class="right" style="margin-right: 10px">
  28. <a href="genindex.html" title="General Index"
  29. accesskey="I">index</a></li>
  30. <li><a href="#">flask-simple-todo v0.1 documentation</a> &raquo;</li>
  31. </ul>
  32. </div>
  33. <div class="document">
  34. <div class="documentwrapper">
  35. <div class="bodywrapper">
  36. <div class="body">
  37. <div class="section" id="welcome-to-todo-for-flask-s-documentation">
  38. <h1>Welcome to Todo for Flask&#8217;s documentation!<a class="headerlink" href="#welcome-to-todo-for-flask-s-documentation" title="Permalink to this headline"></a></h1>
  39. </div>
  40. <div class="section" id="todo">
  41. <h1>介绍 Todo<a class="headerlink" href="#todo" title="Permalink to this headline"></a></h1>
  42. <p>看着高手们用不同的Web框架实现了这个小应用而我这样的新手正在学习Flask就拿来练下手了他们用不同的框架所实现的应用</p>
  43. <ul class="simple">
  44. <li>web.py版 <a class="reference external" href="http://simple-is-better.com/news/309">http://simple-is-better.com/news/309</a></li>
  45. <li>Uliweb版 <a class="reference external" href="http://limodou.github.com/uliweb-doc/basic.html">http://limodou.github.com/uliweb-doc/basic.html</a></li>
  46. <li>Bottle版 <a class="reference external" href="https://bitbucket.org/ZoomQuiet/bottle-simple-tod">https://bitbucket.org/ZoomQuiet/bottle-simple-tod</a></li>
  47. </ul>
  48. <p>TODO具备的功能</p>
  49. <ul class="simple">
  50. <li>实现任务的追加修改删除功能</li>
  51. <li>完成或重置任务功能</li>
  52. </ul>
  53. <p>使用了 <a class="reference external" href="http://packages.python.org/Flask-SQLAlchemy/">Flask-SQLAlchemy</a> 扩展数据库用的是 <tt class="docutils literal"><span class="pre">sqlite</span></tt> 为因为他很小型在做开发的时候用着不错下面就开始一步步的构建这个程序</p>
  54. </div>
  55. <div class="section" id="id1">
  56. <h1>初始准备创建目录<a class="headerlink" href="#id1" title="Permalink to this headline"></a></h1>
  57. <p>web应用多不是一个单一的程序就能解决问题的创建一个目录将所有内容放在这个目录中方便管理本应用目录为:</p>
  58. <div class="highlight-python"><pre>/todo
  59. /static
  60. /templates</pre>
  61. </div>
  62. <p><tt class="docutils literal"><span class="pre">static</span></tt> 目录用于存放如imgjscss等文件这些文件能通过HTTP直接访问 <tt class="docutils literal"><span class="pre">templates</span></tt> 用于存放Flask应用所需要的 <tt class="docutils literal"><span class="pre">jinja2</span></tt> 模板文件我们把所有的模板文件都放在此目录中</p>
  63. </div>
  64. <div class="section" id="id2">
  65. <h1>构建应用程序代码<a class="headerlink" href="#id2" title="Permalink to this headline"></a></h1>
  66. <p>当我们准备好了应用的模式后就可以创建应用的模块了本例中我把它叫做 <tt class="docutils literal"><span class="pre">todo.py</span></tt> 并把它放在 todo 目录中首先我们要导入一些Flash必用的模块和配置如果是一个小应用的话配置可直接放在模块中如果应用比较大可使用单独的文件进行配置然后再导入主模块中即可</p>
  67. <div class="section" id="id3">
  68. <h2>导入模块<a class="headerlink" href="#id3" title="Permalink to this headline"></a></h2>
  69. <div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
  70. </pre></div>
  71. </div>
  72. <p>这里只导入了一个 <tt class="docutils literal"><span class="pre">Flask</span></tt> 模块只需要这个一个模块程序就能运行起来了当然对于更复杂的应用光这一个模块是不够的待会遇到之时我们再进行导入</p>
  73. </div>
  74. <div class="section" id="id4">
  75. <h2>配置<a class="headerlink" href="#id4" title="Permalink to this headline"></a></h2>
  76. <div class="highlight-python"><div class="highlight"><pre><span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
  77. <span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="s">&#39;secret_key&#39;</span>
  78. </pre></div>
  79. </div>
  80. <p>配置选项一开启服务器的debug支持每次修改服务器都会自动重启如果出现问题的话还会提供一个有用的调试器Debug标志用来指示是否开启交互debugger永远不要在生产环境下开始 debug标志因为这样会允许用户在服务器上执行代码</p>
  81. <p>配置选项二我们需要设置 secret_key 来确保客户端Session的安全合理的设置这个值而且越复杂越好Python中的 <tt class="docutils literal"><span class="pre">os.urandom</span></tt> 可方便获得</p>
  82. <div class="highlight-python"><pre>In [1]: import os
  83. In [2]: os.urandom(24)
  84. Out[2]: '7\xe9\xcf\x17\x11\x92I^"|\xbc\x85\xc8\xc1u\x18\xbb\xec\xc9\xe2\xbb,\x9fX'</pre>
  85. </div>
  86. <p>将产生的字符串复制替换掉 <tt class="docutils literal"><span class="pre">secret_key</span></tt> 即可</p>
  87. </div>
  88. <div class="section" id="id5">
  89. <h2>配置初始化<a class="headerlink" href="#id5" title="Permalink to this headline"></a></h2>
  90. <p>由于只是一个小应用初始化我们放在同一文件中完成</p>
  91. <div class="highlight-python"><div class="highlight"><pre><span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
  92. <span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">from_object</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
  93. </pre></div>
  94. </div>
  95. <p><tt class="docutils literal"><span class="pre">from_object</span></tt> 会识别给出的对象如果是一个字符串它会自动导入这个模块然后查找所有已定义的大写变量在我们这个例子里配置在几行代码前你也可以把它移动到一个单独的文件中</p>
  96. </div>
  97. <div class="section" id="id6">
  98. <h2>开启服务器<a class="headerlink" href="#id6" title="Permalink to this headline"></a></h2>
  99. <p>要启动服务器在最后加入这样的代码:</p>
  100. <div class="highlight-python"><div class="highlight"><pre><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
  101. <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
  102. </pre></div>
  103. </div>
  104. <p>现在就能启动服务器了:</p>
  105. <div class="highlight-python"><pre>python todo.py</pre>
  106. </div>
  107. <p>启动后的提示是这样的:</p>
  108. <div class="highlight-python"><pre>* Running on http://127.0.0.1:5000/
  109. * Restarting with reloader...</pre>
  110. </div>
  111. <p>这时就能在浏览器中打开这个网址了不过此时访问服务器你会得到一个404页面没找到的错误因为我们还没有创建视图</p>
  112. </div>
  113. <div class="section" id="id7">
  114. <h2>第一步代码<a class="headerlink" href="#id7" title="Permalink to this headline"></a></h2>
  115. <p>第一步后代码像这样</p>
  116. <div class="highlight-python"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
  117. 2
  118. 3
  119. 4
  120. 5
  121. 6
  122. 7
  123. 8
  124. 9
  125. 10
  126. 11
  127. 12</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/usr/bin/env python</span>
  128. <span class="c">#coding:utf-8</span>
  129. <span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
  130. <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
  131. <span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="s">&#39;7</span><span class="se">\xe9\xcf\x17\x11\x92</span><span class="s">I^&quot;|</span><span class="se">\xbc\x85\xc8\xc1</span><span class="s">u</span><span class="se">\x18\xbb\xec\xc9\xe2\xbb</span><span class="s">,</span><span class="se">\x9f</span><span class="s">X&#39;</span>
  132. <span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
  133. <span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">from_object</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
  134. <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
  135. <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
  136. </pre></div>
  137. </td></tr></table></div>
  138. </div>
  139. </div>
  140. <div class="section" id="id8">
  141. <h1>创建数据库<a class="headerlink" href="#id8" title="Permalink to this headline"></a></h1>
  142. <p>创建数据库分为三步 配置数据库初始化数据库和数据库模型这里以 <a class="reference external" href="http://packages.python.org/Flask-SQLAlchemy/">Flask-SQLAlchemy</a> 为例</p>
  143. <div class="section" id="id9">
  144. <h2>配置<a class="headerlink" href="#id9" title="Permalink to this headline"></a></h2>
  145. <p>配置数据库只需要模块的配置部分加入下面这行代码:</p>
  146. <div class="highlight-python"><div class="highlight"><pre><span class="n">SQLALCHEMY_DATABASE_URI</span> <span class="o">=</span> <span class="s">&#39;sqlite:///todo.sqlite&#39;</span>
  147. </pre></div>
  148. </div>
  149. <p>这是一个关于 sqlite 的配置其它配置可参看 <a class="reference external" href="http://packages.python.org/Flask-SQLAlchemy/config.html#connection-uri-format">这里</a> </p>
  150. </div>
  151. <div class="section" id="id11">
  152. <h2>创建数据库实例<a class="headerlink" href="#id11" title="Permalink to this headline"></a></h2>
  153. <p><tt class="docutils literal"><span class="pre">SQLAlchemy</span></tt> 模块导入:</p>
  154. <div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">flaskext.sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
  155. </pre></div>
  156. </div>
  157. <p>在前面的 <tt class="docutils literal"><span class="pre">app</span></tt> 配置后面加入下面两行代码:</p>
  158. <div class="highlight-python"><div class="highlight"><pre><span class="n">db</span> <span class="o">=</span> <span class="n">SQLAlchemy</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
  159. <span class="n">db</span><span class="o">.</span><span class="n">init_app</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
  160. </pre></div>
  161. </div>
  162. </div>
  163. <div class="section" id="id12">
  164. <h2>创建数据模型<a class="headerlink" href="#id12" title="Permalink to this headline"></a></h2>
  165. <p>数据模型:</p>
  166. <div class="highlight-python"><div class="highlight"><pre><span class="k">class</span> <span class="nc">Todo</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
  167. <span class="sd">&#39;&#39;&#39;数据模型&#39;&#39;&#39;</span>
  168. <span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
  169. <span class="n">title</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
  170. <span class="n">posted_on</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Date</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">)</span>
  171. <span class="n">status</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Boolean</span><span class="p">(),</span> <span class="n">default</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
  172. </pre></div>
  173. </div>
  174. <p>模型型初始化:</p>
  175. <div class="highlight-python"><div class="highlight"><pre><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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
  176. <span class="nb">super</span><span class="p">(</span><span class="n">Todo</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
  177. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  178. <span class="k">return</span> <span class="s">&quot;&lt;Todo &#39;</span><span class="si">%s</span><span class="s">&#39;&gt;&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">title</span>
  179. </pre></div>
  180. </div>
  181. <p>模型增补数据操作功能:</p>
  182. <div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">store_to_db</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  183. <span class="sd">&#39;&#39;&#39;保存数据到数据库&#39;&#39;&#39;</span>
  184. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  185. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
  186. <span class="k">def</span> <span class="nf">delete_todo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  187. <span class="sd">&#39;&#39;&#39;删除数据&#39;&#39;&#39;</span>
  188. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  189. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
  190. </pre></div>
  191. </div>
  192. </div>
  193. <div class="section" id="id13">
  194. <h2>初始化数据库<a class="headerlink" href="#id13" title="Permalink to this headline"></a></h2>
  195. <p>进入python命令行然后:</p>
  196. <div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">todo</span> <span class="kn">import</span> <span class="n">db</span>
  197. <span class="n">db</span><span class="o">.</span><span class="n">create_all</span><span class="p">()</span>
  198. </pre></div>
  199. </div>
  200. <p>如果没问题的话你可以在当前目录中看到数据库文件了如果需要重建数据表可使用 <tt class="docutils literal"><span class="pre">db.drop_all()</span></tt> 清除数据</p>
  201. </div>
  202. <div class="section" id="id14">
  203. <h2>第二步代码<a class="headerlink" href="#id14" title="Permalink to this headline"></a></h2>
  204. <p>第二步后代码像这样</p>
  205. <div class="highlight-python"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
  206. 2
  207. 3
  208. 4
  209. 5
  210. 6
  211. 7
  212. 8
  213. 9
  214. 10
  215. 11
  216. 12
  217. 13
  218. 14
  219. 15
  220. 16
  221. 17
  222. 18
  223. 19
  224. 20
  225. 21
  226. 22
  227. 23
  228. 24
  229. 25
  230. 26
  231. 27
  232. 28
  233. 29
  234. 30
  235. 31
  236. 32
  237. 33
  238. 34
  239. 35
  240. 36
  241. 37
  242. 38
  243. 39
  244. 40
  245. 41
  246. 42
  247. 43
  248. 44</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/usr/bin/env python</span>
  249. <span class="c">#coding:utf-8</span>
  250. <span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
  251. <span class="kn">from</span> <span class="nn">flaskext.sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
  252. <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
  253. <span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="s">&#39;7</span><span class="se">\xe9\xcf\x17\x11\x92</span><span class="s">I^&quot;|</span><span class="se">\xbc\x85\xc8\xc1</span><span class="s">u</span><span class="se">\x18\xbb\xec\xc9\xe2\xbb</span><span class="s">,</span><span class="se">\x9f</span><span class="s">X&#39;</span>
  254. <span class="n">SQLALCHEMY_DATABASE_URI</span> <span class="o">=</span> <span class="s">&#39;sqlite:///todo.sqlite&#39;</span>
  255. <span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
  256. <span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">from_object</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
  257. <span class="n">db</span> <span class="o">=</span> <span class="n">SQLAlchemy</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
  258. <span class="n">db</span><span class="o">.</span><span class="n">init_app</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
  259. <span class="k">class</span> <span class="nc">Todo</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
  260. <span class="sd">&#39;&#39;&#39;数据模型&#39;&#39;&#39;</span>
  261. <span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
  262. <span class="n">title</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
  263. <span class="n">posted_on</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Date</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">)</span>
  264. <span class="n">status</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Boolean</span><span class="p">(),</span> <span class="n">default</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
  265. <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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
  266. <span class="nb">super</span><span class="p">(</span><span class="n">Todo</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
  267. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  268. <span class="k">return</span> <span class="s">&quot;&lt;Todo &#39;</span><span class="si">%s</span><span class="s">&#39;&gt;&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">title</span>
  269. <span class="k">def</span> <span class="nf">store_to_db</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  270. <span class="sd">&#39;&#39;&#39;保存数据到数据库&#39;&#39;&#39;</span>
  271. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  272. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
  273. <span class="k">def</span> <span class="nf">delete_todo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  274. <span class="sd">&#39;&#39;&#39;删除数据&#39;&#39;&#39;</span>
  275. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  276. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
  277. <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
  278. <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
  279. </pre></div>
  280. </td></tr></table></div>
  281. </div>
  282. </div>
  283. <div class="section" id="id15">
  284. <h1>表单<a class="headerlink" href="#id15" title="Permalink to this headline"></a></h1>
  285. <p>表单引入模块:</p>
  286. <div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">flaskext.wtf</span> <span class="kn">import</span> <span class="n">Form</span><span class="p">,</span> <span class="n">TextField</span><span class="p">,</span> <span class="n">SubmitField</span><span class="p">,</span> <span class="n">required</span><span class="p">,</span> <span class="n">ValidationError</span>
  287. </pre></div>
  288. </div>
  289. <p>表单代码:</p>
  290. <div class="highlight-python"><div class="highlight"><pre><span class="k">class</span> <span class="nc">TodoForm</span><span class="p">(</span><span class="n">Form</span><span class="p">):</span>
  291. <span class="sd">&#39;&#39;&#39;表单&#39;&#39;&#39;</span>
  292. <span class="n">title</span> <span class="o">=</span> <span class="n">TextField</span><span class="p">(</span><span class="s">u&quot;内容&quot;</span><span class="p">,</span> <span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">required</span><span class="p">(</span><span class="n">message</span><span class="o">=</span><span class="s">u&quot;任务内容&quot;</span><span class="p">)])</span>
  293. </pre></div>
  294. </div>
  295. <p>只是一个表单当然也可以直接放到html中.定义好的表单可用如下方式进行调用:</p>
  296. <div class="highlight-python"><pre>{{ form.title.label }} {{ form.title }}</pre>
  297. </div>
  298. <p>将其写入HTML的 <tt class="docutils literal"><span class="pre">&lt;form&gt;&lt;/form</span></tt> 即可</p>
  299. </div>
  300. <div class="section" id="id16">
  301. <h1>视图<a class="headerlink" href="#id16" title="Permalink to this headline"></a></h1>
  302. <p>现在数据库连接已能正常工作了这步就开始写视图函数五个功能视图及一个404视图</p>
  303. <div class="section" id="route">
  304. <h2>route<a class="headerlink" href="#route" title="Permalink to this headline"></a></h2>
  305. <p>装饰器 <tt class="docutils literal"><span class="pre">flask.Flask.route</span></tt> 用于绑定一个函数到一个网址但是它不仅仅只有这些!你可以构造动态的网址并给函数附加多个规则.</p>
  306. <p>这里是一个例子:</p>
  307. <div class="highlight-python"><div class="highlight"><pre><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
  308. <span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
  309. <span class="k">return</span> <span class="s">&#39;Index Page&#39;</span>
  310. <span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/hello&#39;</span><span class="p">)</span>
  311. <span class="k">def</span> <span class="nf">hello</span><span class="p">():</span>
  312. <span class="k">return</span> <span class="s">&#39;Hello World&#39;</span>
  313. </pre></div>
  314. </div>
  315. <p>一个函数可对应我个视图 <tt class="docutils literal"><span class="pre">index</span></tt> 视图也可以再加个 <tt class="docutils literal"><span class="pre">&#64;app.route('/index')</span></tt> ,这样 <tt class="docutils literal"><span class="pre">/</span></tt> <tt class="docutils literal"><span class="pre">/index</span></tt> 都会调用 <tt class="docutils literal"><span class="pre">index</span></tt> 函数每个视力都必须 <tt class="docutils literal"><span class="pre">return</span></tt> 语句返回调用</p>
  316. </div>
  317. <div class="section" id="id17">
  318. <h2>主视图<a class="headerlink" href="#id17" title="Permalink to this headline"></a></h2>
  319. <p>主视图代码如下</p>
  320. <div class="highlight-python"><div class="highlight"><pre><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&#39;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;GET&#39;</span><span class="p">,</span> <span class="s">&#39;POST&#39;</span><span class="p">])</span>
  321. <span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
  322. <span class="n">todo</span> <span class="o">=</span> <span class="n">Todo</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s">&#39;-id&#39;</span><span class="p">)</span>
  323. <span class="n">form</span> <span class="o">=</span> <span class="n">TodoForm</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">)</span>
  324. <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s">&#39;POST&#39;</span> <span class="ow">and</span> <span class="n">form</span><span class="o">.</span><span class="n">validate_on_submit</span><span class="p">():</span>
  325. <span class="n">t</span> <span class="o">=</span> <span class="n">Todo</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="n">form</span><span class="o">.</span><span class="n">title</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
  326. <span class="k">try</span><span class="p">:</span>
  327. <span class="n">t</span><span class="o">.</span><span class="n">store_to_db</span><span class="p">()</span>
  328. <span class="n">flash</span><span class="p">(</span><span class="s">u&quot;添加成功&quot;</span><span class="p">)</span>
  329. <span class="k">return</span> <span class="n">redirect</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;next&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">url_for</span><span class="p">(</span><span class="s">&#39;index&#39;</span><span class="p">))</span>
  330. <span class="k">except</span><span class="p">:</span>
  331. <span class="n">flash</span><span class="p">(</span><span class="s">u&#39;存储失败&#39;</span><span class="p">)</span>
  332. <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;index.html&#39;</span><span class="p">,</span> <span class="n">todo</span><span class="o">=</span><span class="n">todo</span><span class="p">,</span> <span class="n">form</span><span class="o">=</span><span class="n">form</span><span class="p">)</span>
  333. </pre></div>
  334. </div>
  335. </div>
  336. <div class="section" id="id18">
  337. <h2>编辑视图<a class="headerlink" href="#id18" title="Permalink to this headline"></a></h2>
  338. <div class="highlight-python"><div class="highlight"><pre><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&lt;int:id&gt;/edit&#39;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;GET&#39;</span><span class="p">,</span> <span class="s">&#39;POST&#39;</span><span class="p">])</span>
  339. <span class="k">def</span> <span class="nf">edit</span><span class="p">(</span><span class="nb">id</span><span class="p">):</span>
  340. <span class="n">todo</span> <span class="o">=</span> <span class="n">Todo</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">filter_by</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="nb">id</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
  341. <span class="n">form</span> <span class="o">=</span> <span class="n">TodoForm</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="n">todo</span><span class="o">.</span><span class="n">title</span><span class="p">)</span>
  342. <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s">&#39;POST&#39;</span> <span class="ow">and</span> <span class="n">form</span><span class="o">.</span><span class="n">validate_on_submit</span><span class="p">():</span>
  343. <span class="n">Todo</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">filter_by</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="nb">id</span><span class="p">)</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="n">Todo</span><span class="o">.</span><span class="n">title</span><span class="p">:</span><span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s">&#39;title&#39;</span><span class="p">]})</span>
  344. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
  345. <span class="n">flash</span><span class="p">(</span><span class="s">u&quot;记录编辑成功&quot;</span><span class="p">)</span>
  346. <span class="k">return</span> <span class="n">redirect</span><span class="p">(</span><span class="n">url_for</span><span class="p">(</span><span class="s">&#39;index&#39;</span><span class="p">))</span>
  347. <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;edit.html&#39;</span><span class="p">,</span> <span class="n">todo</span><span class="o">=</span><span class="n">todo</span><span class="p">,</span> <span class="n">form</span><span class="o">=</span><span class="n">form</span><span class="p">)</span>
  348. </pre></div>
  349. </div>
  350. </div>
  351. <div class="section" id="id19">
  352. <h2>删除视图<a class="headerlink" href="#id19" title="Permalink to this headline"></a></h2>
  353. <div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">tdel</span><span class="p">(</span><span class="nb">id</span><span class="p">):</span>
  354. <span class="n">todo</span> <span class="o">=</span> <span class="n">Todo</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">filter_by</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="nb">id</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
  355. <span class="k">if</span> <span class="n">todo</span><span class="p">:</span>
  356. <span class="n">todo</span><span class="o">.</span><span class="n">delete_todo</span><span class="p">()</span>
  357. <span class="n">flash</span><span class="p">(</span><span class="s">u&quot;记录删除成功&quot;</span><span class="p">)</span>
  358. <span class="k">return</span> <span class="n">redirect</span><span class="p">(</span><span class="n">url_for</span><span class="p">(</span><span class="s">&#39;index&#39;</span><span class="p">))</span>
  359. </pre></div>
  360. </div>
  361. </div>
  362. <div class="section" id="id20">
  363. <h2>完成视图<a class="headerlink" href="#id20" title="Permalink to this headline"></a></h2>
  364. <div class="highlight-python"><pre>@app.route('/&lt;int:id&gt;/done')
  365. def done(id):
  366. todo = Todo.query.filter_by(id=id).first()
  367. if todo:
  368. Todo.query.filter_by(id=id).update({Todo.status:True})
  369. db.session.commit()
  370. flash(u"任务完成")
  371. return redirect(url_for('index'))</pre>
  372. </div>
  373. </div>
  374. <div class="section" id="id21">
  375. <h2>重置视图<a class="headerlink" href="#id21" title="Permalink to this headline"></a></h2>
  376. <div class="highlight-python"><div class="highlight"><pre><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&lt;int:id&gt;/redo&#39;</span><span class="p">)</span>
  377. <span class="k">def</span> <span class="nf">redo</span><span class="p">(</span><span class="nb">id</span><span class="p">):</span>
  378. <span class="n">todo</span> <span class="o">=</span> <span class="n">Todo</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">filter_by</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="nb">id</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
  379. <span class="k">if</span> <span class="n">todo</span><span class="p">:</span>
  380. <span class="n">Todo</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">filter_by</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="nb">id</span><span class="p">)</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="n">Todo</span><span class="o">.</span><span class="n">status</span><span class="p">:</span><span class="bp">False</span><span class="p">})</span>
  381. <span class="n">flash</span><span class="p">(</span><span class="s">u&quot;记录重置成功&quot;</span><span class="p">)</span>
  382. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
  383. <span class="k">return</span> <span class="n">redirect</span><span class="p">(</span><span class="n">url_for</span><span class="p">(</span><span class="s">&#39;index&#39;</span><span class="p">))</span>
  384. </pre></div>
  385. </div>
  386. </div>
  387. <div class="section" id="id22">
  388. <h2>404视图<a class="headerlink" href="#id22" title="Permalink to this headline"></a></h2>
  389. <div class="highlight-python"><div class="highlight"><pre><span class="nd">@app.errorhandler</span><span class="p">(</span><span class="mi">404</span><span class="p">)</span>
  390. <span class="k">def</span> <span class="nf">page_not_found</span><span class="p">(</span><span class="n">error</span><span class="p">):</span>
  391. <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;page_404.html&#39;</span><span class="p">),</span> <span class="mi">404</span>
  392. </pre></div>
  393. </div>
  394. </div>
  395. <div class="section" id="id23">
  396. <h2>整个代码<a class="headerlink" href="#id23" title="Permalink to this headline"></a></h2>
  397. <div class="highlight-python"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
  398. 2
  399. 3
  400. 4
  401. 5
  402. 6
  403. 7
  404. 8
  405. 9
  406. 10
  407. 11
  408. 12
  409. 13
  410. 14
  411. 15
  412. 16
  413. 17
  414. 18
  415. 19
  416. 20
  417. 21
  418. 22
  419. 23
  420. 24
  421. 25
  422. 26
  423. 27
  424. 28
  425. 29
  426. 30
  427. 31
  428. 32
  429. 33
  430. 34
  431. 35
  432. 36
  433. 37
  434. 38
  435. 39
  436. 40
  437. 41
  438. 42
  439. 43
  440. 44
  441. 45
  442. 46
  443. 47
  444. 48
  445. 49
  446. 50
  447. 51
  448. 52
  449. 53
  450. 54
  451. 55
  452. 56
  453. 57
  454. 58
  455. 59
  456. 60
  457. 61
  458. 62
  459. 63
  460. 64
  461. 65
  462. 66
  463. 67
  464. 68
  465. 69
  466. 70
  467. 71
  468. 72
  469. 73
  470. 74
  471. 75
  472. 76
  473. 77
  474. 78
  475. 79
  476. 80
  477. 81
  478. 82
  479. 83
  480. 84
  481. 85
  482. 86
  483. 87
  484. 88
  485. 89
  486. 90
  487. 91
  488. 92
  489. 93
  490. 94
  491. 95
  492. 96
  493. 97
  494. 98
  495. 99
  496. 100
  497. 101
  498. 102
  499. 103
  500. 104
  501. 105
  502. 106
  503. 107
  504. 108
  505. 109
  506. 110
  507. 111
  508. 112</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/usr/bin/env python</span>
  509. <span class="c">#coding:utf-8</span>
  510. <span class="kn">import</span> <span class="nn">os</span>
  511. <span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
  512. <span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span><span class="p">,</span> <span class="n">render_template</span><span class="p">,</span> <span class="n">url_for</span><span class="p">,</span> <span class="n">redirect</span><span class="p">,</span> <span class="n">flash</span><span class="p">,</span> <span class="n">request</span>
  513. <span class="kn">from</span> <span class="nn">flaskext.sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
  514. <span class="kn">from</span> <span class="nn">flaskext.wtf</span> <span class="kn">import</span> <span class="n">Form</span><span class="p">,</span> <span class="n">TextField</span><span class="p">,</span> <span class="n">SubmitField</span><span class="p">,</span> <span class="n">required</span><span class="p">,</span> <span class="n">ValidationError</span>
  515. <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
  516. <span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="s">&#39;7</span><span class="se">\xe9\xcf\x17\x11\x92</span><span class="s">I^&quot;|</span><span class="se">\xbc\x85\xc8\xc1</span><span class="s">u</span><span class="se">\x18\xbb\xec\xc9\xe2\xbb</span><span class="s">,</span><span class="se">\x9f</span><span class="s">X&#39;</span>
  517. <span class="n">SQLALCHEMY_DATABASE_URI</span> <span class="o">=</span> <span class="s">&#39;sqlite:///todo.sqlite&#39;</span>
  518. <span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
  519. <span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">from_object</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
  520. <span class="n">db</span> <span class="o">=</span> <span class="n">SQLAlchemy</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
  521. <span class="n">db</span><span class="o">.</span><span class="n">init_app</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
  522. <span class="k">class</span> <span class="nc">Todo</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
  523. <span class="sd">&#39;&#39;&#39;数据模型&#39;&#39;&#39;</span>
  524. <span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
  525. <span class="n">title</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
  526. <span class="n">posted_on</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Date</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">)</span>
  527. <span class="n">status</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Boolean</span><span class="p">(),</span> <span class="n">default</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
  528. <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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
  529. <span class="nb">super</span><span class="p">(</span><span class="n">Todo</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
  530. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  531. <span class="k">return</span> <span class="s">&quot;&lt;Todo &#39;</span><span class="si">%s</span><span class="s">&#39;&gt;&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">title</span>
  532. <span class="k">def</span> <span class="nf">store_to_db</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  533. <span class="sd">&#39;&#39;&#39;保存数据到数据库&#39;&#39;&#39;</span>
  534. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  535. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
  536. <span class="k">def</span> <span class="nf">delete_todo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  537. <span class="sd">&#39;&#39;&#39;删除数据&#39;&#39;&#39;</span>
  538. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  539. <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
  540. <span class="k">class</span> <span class="nc">TodoForm</span><span class="p">(</span><span class="n">Form</span><span class="p">):</span>
  541. <span class="sd">&#39;&#39;&#39;表单&#39;&#39;&#39;</span>
  542. <span class="n">title</span> <span class="o">=</span> <span class="n">TextField</span><span class="p">(</span><span class="s">u&quot;内容&quot;</span><span class="p">,</span> <span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">required</span><span class="p">(</span><span class="n">message</span><span class="o">=</span><span class="s">u&quot;任务内容&quot;</span><span class="p">)])</span>
  543. <span class="c">#submit = SubmitField(u&quot;Add&quot;)</span>
  544. <span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&#39;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;GET&#39;</span><span class="p">,</span> <span class="s">&#39;POST&#39;</span><span class="p">])</span>
  545. <span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
  546. <span class="n">todo</span> <span class="o">=</span> <span class="n">Todo</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s">&#39;-id&#39;</span><span class="p">)</span>
  547. <span class="n">form</span> <span class="o">=</span> <span class="n">TodoForm</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">)</span>
  548. <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s">&#39;POST&#39;</span> <span class="ow">and</span> <span class="n">form</span><span class="o">.</span><span class="n">validate_on_submit</span><span class="p">():</span>
  549. <span class="n">t</span> <span class="o">=</span> <span class="n">Todo</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="n">form</span><span class="o">.</span><span class="n">title</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
  550. <span class="k">try</span><span class="p">:</span>
  551. <span class="n">t</span><span class="o">.</span><span class="n">store_to_db</span><span class="p">()</span>
  552. <span class="n">flash</span><span class="p">(</span><span class="s">u&quot;添加成功&quot;</span><span class="p">)</span>
  553. <span class="k">return</span> <span class="n">redirect</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;next&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">url_for</span><span class="p">(</span><span class="s">&#39;index&#39;</span><span class="p">))</span>
  554. <span class="k">except</span><span class="p">:</span>
  555. <span class="n">flash</span><span class="p">(</span><span class="s">u&#39;存储失败&#39;</span><span class="p">)</span>
  556. <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;index.html&#39;</span><span class="p">,</span> <span class="n">todo</span><span class="o">=</span><span class="n">todo</span><span class="p">,</span> <span class="n">form</span><span class="o">=</span><span class="n">form</span><span class="p">)</span>
  557. <span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&lt;int:id&gt;/del&#39;</span><span class="p">)</span>
  558. <span class="k">def</span> <span class="nf">tdel</span><span class="p">(</span><span class="nb">id</span><span class="p">):</span>
  559. <span class="n">todo</span> <span class="o">=</span> <span class="n">Todo</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">filter_by</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="nb">id</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
  560. <span class="k">if</span> <span class="n">todo</span><span class="p">:</span>
  561. <span class="n">todo</span><span class="o">.</span><span class="n">delete_todo</span><span class="p">()</span>
  562. <span class="n">flash</span><span class="p">(</span><span class="s">u&quot;记录删除成功&quot;</span><span class="p">)</span>
  563. <span class="k">return</span> <span class="n">