/docs/_build/html/index.html
HTML | 612 lines | 607 code | 5 blank | 0 comment | 0 complexity | 7aa28b73c50ed33c77a5d1bc1d724c8e MD5 | raw file
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-
- <title>Welcome to Todo for Flask’s documentation! — flask-simple-todo v0.1 documentation</title>
- <link rel="stylesheet" href="_static/nature.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '',
- VERSION: '0.1',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true
- };
- </script>
- <script type="text/javascript" src="_static/jquery.js"></script>
- <script type="text/javascript" src="_static/underscore.js"></script>
- <script type="text/javascript" src="_static/doctools.js"></script>
- <link rel="top" title="flask-simple-todo v0.1 documentation" href="#" />
- </head>
- <body>
- <div class="related">
- <h3>Navigation</h3>
- <ul>
- <li class="right" style="margin-right: 10px">
- <a href="genindex.html" title="General Index"
- accesskey="I">index</a></li>
- <li><a href="#">flask-simple-todo v0.1 documentation</a> »</li>
- </ul>
- </div>
- <div class="document">
- <div class="documentwrapper">
- <div class="bodywrapper">
- <div class="body">
-
- <div class="section" id="welcome-to-todo-for-flask-s-documentation">
- <h1>Welcome to Todo for Flask’s documentation!<a class="headerlink" href="#welcome-to-todo-for-flask-s-documentation" title="Permalink to this headline">¶</a></h1>
- </div>
- <div class="section" id="todo">
- <h1>介绍 Todo<a class="headerlink" href="#todo" title="Permalink to this headline">¶</a></h1>
- <p>看着高手们用不同的Web框架实现了这个小应用,而我这样的新手正在学习Flask,就拿来练下手了,他们用不同的框架所实现的应用:</p>
- <ul class="simple">
- <li>web.py版 <a class="reference external" href="http://simple-is-better.com/news/309">http://simple-is-better.com/news/309</a></li>
- <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>
- <li>Bottle版 <a class="reference external" href="https://bitbucket.org/ZoomQuiet/bottle-simple-tod">https://bitbucket.org/ZoomQuiet/bottle-simple-tod</a></li>
- </ul>
- <p>TODO具备的功能:</p>
- <ul class="simple">
- <li>实现任务的追加,修改,删除功能。</li>
- <li>完成或重置任务功能。</li>
- </ul>
- <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>
- </div>
- <div class="section" id="id1">
- <h1>初始准备:创建目录<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h1>
- <p>web应用,多不是一个单一的程序就能解决问题的,创建一个目录,将所有内容放在这个目录中,方便管理。本应用目录为::</p>
- <div class="highlight-python"><pre>/todo
- /static
- /templates</pre>
- </div>
- <p><tt class="docutils literal"><span class="pre">static</span></tt> 目录用于存放如img、js、css等文件,这些文件能通过HTTP直接访问, <tt class="docutils literal"><span class="pre">templates</span></tt> 用于存放Flask应用所需要的 <tt class="docutils literal"><span class="pre">jinja2</span></tt> 模板文件。我们把所有的模板文件都放在此目录中。</p>
- </div>
- <div class="section" id="id2">
- <h1>构建应用程序代码<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h1>
- <p>当我们准备好了应用的模式后,就可以创建应用的模块了。本例中,我把它叫做 <tt class="docutils literal"><span class="pre">todo.py</span></tt> ,并把它放在 todo 目录中。首先我们要导入一些Flash必用的模块和配置。如果是一个小应用的话,配置可直接放在模块中,如果应用比较大,可使用单独的文件进行配置,然后再导入主模块中即可。</p>
- <div class="section" id="id3">
- <h2>导入模块<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h2>
- <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>
- </pre></div>
- </div>
- <p>这里只导入了一个 <tt class="docutils literal"><span class="pre">Flask</span></tt> 模块,只需要这个一个模块,程序就能运行起来了,当然对于更复杂的应用,光这一个模块是不够的,待会遇到之时,我们再进行导入。</p>
- </div>
- <div class="section" id="id4">
- <h2>配置<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h2>
- <div class="highlight-python"><div class="highlight"><pre><span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
- <span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="s">'secret_key'</span>
- </pre></div>
- </div>
- <p>配置选项一,开启服务器的debug支持,每次修改服务器都会自动重启,如果出现问题的话,还会提供一个有用的调试器。Debug标志用来指示是否开启交互debugger。永远不要在生产环境下开始 debug标志,因为这样会允许用户在服务器上执行代码!</p>
- <p>配置选项二,我们需要设置 secret_key 来确保客户端Session的安全。合理的设置这个值,而且越复杂越好。Python中的 <tt class="docutils literal"><span class="pre">os.urandom</span></tt> 可方便获得:</p>
- <div class="highlight-python"><pre>In [1]: import os
- In [2]: os.urandom(24)
- Out[2]: '7\xe9\xcf\x17\x11\x92I^"|\xbc\x85\xc8\xc1u\x18\xbb\xec\xc9\xe2\xbb,\x9fX'</pre>
- </div>
- <p>将产生的字符串复制替换掉 <tt class="docutils literal"><span class="pre">secret_key</span></tt> 即可</p>
- </div>
- <div class="section" id="id5">
- <h2>配置初始化<a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h2>
- <p>由于只是一个小应用,初始化我们放在同一文件中完成</p>
- <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>
- <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>
- </pre></div>
- </div>
- <p><tt class="docutils literal"><span class="pre">from_object</span></tt> 会识别给出的对象(如果是一个字符串,它会自动导入这个模块),然后查找所有已定义的大写变量。在我们这个例子里,配置在几行代码前。你也可以把它移动到一个单独的文件中。</p>
- </div>
- <div class="section" id="id6">
- <h2>开启服务器<a class="headerlink" href="#id6" title="Permalink to this headline">¶</a></h2>
- <p>要启动服务器,在最后加入这样的代码::</p>
- <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">'__main__'</span><span class="p">:</span>
- <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
- </pre></div>
- </div>
- <p>现在就能启动服务器了::</p>
- <div class="highlight-python"><pre>python todo.py</pre>
- </div>
- <p>启动后的提示是这样的::</p>
- <div class="highlight-python"><pre>* Running on http://127.0.0.1:5000/
- * Restarting with reloader...</pre>
- </div>
- <p>这时就能在浏览器中打开这个网址了,不过此时访问服务器,你会得到一个404页面没找到的错误。因为我们还没有创建视图。</p>
- </div>
- <div class="section" id="id7">
- <h2>第一步代码<a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h2>
- <p>第一步后,代码像这样:</p>
- <div class="highlight-python"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/usr/bin/env python</span>
- <span class="c">#coding:utf-8</span>
- <span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
- <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
- <span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="s">'7</span><span class="se">\xe9\xcf\x17\x11\x92</span><span class="s">I^"|</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'</span>
- <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>
- <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>
- <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
- <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
- </pre></div>
- </td></tr></table></div>
- </div>
- </div>
- <div class="section" id="id8">
- <h1>创建数据库<a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h1>
- <p>创建数据库,分为三步: 配置数据库,初始化数据库和数据库模型,这里以 <a class="reference external" href="http://packages.python.org/Flask-SQLAlchemy/">Flask-SQLAlchemy</a> 为例。</p>
- <div class="section" id="id9">
- <h2>配置<a class="headerlink" href="#id9" title="Permalink to this headline">¶</a></h2>
- <p>配置数据库,只需要模块的配置部分加入下面这行代码::</p>
- <div class="highlight-python"><div class="highlight"><pre><span class="n">SQLALCHEMY_DATABASE_URI</span> <span class="o">=</span> <span class="s">'sqlite:///todo.sqlite'</span>
- </pre></div>
- </div>
- <p>这是一个关于 sqlite 的配置,其它配置,可参看 <a class="reference external" href="http://packages.python.org/Flask-SQLAlchemy/config.html#connection-uri-format">这里</a> 。</p>
- </div>
- <div class="section" id="id11">
- <h2>创建数据库实例<a class="headerlink" href="#id11" title="Permalink to this headline">¶</a></h2>
- <p><tt class="docutils literal"><span class="pre">SQLAlchemy</span></tt> 模块导入::</p>
- <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>
- </pre></div>
- </div>
- <p>在前面的 <tt class="docutils literal"><span class="pre">app</span></tt> 配置后面加入下面两行代码::</p>
- <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>
- <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>
- </pre></div>
- </div>
- </div>
- <div class="section" id="id12">
- <h2>创建数据模型<a class="headerlink" href="#id12" title="Permalink to this headline">¶</a></h2>
- <p>数据模型::</p>
- <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>
- <span class="sd">'''数据模型'''</span>
- <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>
- <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>
- <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>
- <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>
- </pre></div>
- </div>
- <p>模型型初始化::</p>
- <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>
- <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>
- <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="s">"<Todo '</span><span class="si">%s</span><span class="s">'>"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">title</span>
- </pre></div>
- </div>
- <p>模型增补数据操作功能::</p>
- <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>
- <span class="sd">'''保存数据到数据库'''</span>
- <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>
- <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>
- <span class="k">def</span> <span class="nf">delete_todo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">'''删除数据'''</span>
- <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>
- <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>
- </pre></div>
- </div>
- </div>
- <div class="section" id="id13">
- <h2>初始化数据库<a class="headerlink" href="#id13" title="Permalink to this headline">¶</a></h2>
- <p>进入python命令行,然后::</p>
- <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>
- <span class="n">db</span><span class="o">.</span><span class="n">create_all</span><span class="p">()</span>
- </pre></div>
- </div>
- <p>如果没问题的话,你可以在当前目录中看到数据库文件了。如果需要重建数据表,可使用 <tt class="docutils literal"><span class="pre">db.drop_all()</span></tt> 清除数据。</p>
- </div>
- <div class="section" id="id14">
- <h2>第二步代码<a class="headerlink" href="#id14" title="Permalink to this headline">¶</a></h2>
- <p>第二步后,代码像这样:</p>
- <div class="highlight-python"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/usr/bin/env python</span>
- <span class="c">#coding:utf-8</span>
- <span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
- <span class="kn">from</span> <span class="nn">flaskext.sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
- <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
- <span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="s">'7</span><span class="se">\xe9\xcf\x17\x11\x92</span><span class="s">I^"|</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'</span>
- <span class="n">SQLALCHEMY_DATABASE_URI</span> <span class="o">=</span> <span class="s">'sqlite:///todo.sqlite'</span>
- <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>
- <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>
- <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>
- <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>
- <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>
- <span class="sd">'''数据模型'''</span>
-
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="s">"<Todo '</span><span class="si">%s</span><span class="s">'>"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">title</span>
- <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>
- <span class="sd">'''保存数据到数据库'''</span>
-
- <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>
- <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>
- <span class="k">def</span> <span class="nf">delete_todo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">'''删除数据'''</span>
-
- <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>
- <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>
- <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
- <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
- </pre></div>
- </td></tr></table></div>
- </div>
- </div>
- <div class="section" id="id15">
- <h1>表单<a class="headerlink" href="#id15" title="Permalink to this headline">¶</a></h1>
- <p>表单引入模块::</p>
- <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>
- </pre></div>
- </div>
- <p>表单代码::</p>
- <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>
- <span class="sd">'''表单'''</span>
- <span class="n">title</span> <span class="o">=</span> <span class="n">TextField</span><span class="p">(</span><span class="s">u"内容"</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"任务内容"</span><span class="p">)])</span>
- </pre></div>
- </div>
- <p>只是一个表单,当然也可以直接放到html中.定义好的表单,可用如下方式进行调用::</p>
- <div class="highlight-python"><pre>{{ form.title.label }} {{ form.title }}</pre>
- </div>
- <p>将其写入HTML的 <tt class="docutils literal"><span class="pre"><form></form</span></tt> 即可。</p>
- </div>
- <div class="section" id="id16">
- <h1>视图<a class="headerlink" href="#id16" title="Permalink to this headline">¶</a></h1>
- <p>现在数据库连接已能正常工作了,这步就开始写视图函数。五个功能视图及一个404视图。</p>
- <div class="section" id="route">
- <h2>route<a class="headerlink" href="#route" title="Permalink to this headline">¶</a></h2>
- <p>装饰器 <tt class="docutils literal"><span class="pre">flask.Flask.route</span></tt> 用于绑定一个函数到一个网址。但是它不仅仅只有这些!你可以构造动态的网址并给函数附加多个规则.</p>
- <p>这里是一个例子::</p>
- <div class="highlight-python"><div class="highlight"><pre><span class="nd">@app.route</span><span class="p">(</span><span class="s">'/'</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
- <span class="k">return</span> <span class="s">'Index Page'</span>
- <span class="nd">@app.route</span><span class="p">(</span><span class="s">'/hello'</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">hello</span><span class="p">():</span>
- <span class="k">return</span> <span class="s">'Hello World'</span>
- </pre></div>
- </div>
- <p>一个函数可对应我个视图。如 <tt class="docutils literal"><span class="pre">index</span></tt> 视图,也可以再加个 <tt class="docutils literal"><span class="pre">@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>
- </div>
- <div class="section" id="id17">
- <h2>主视图<a class="headerlink" href="#id17" title="Permalink to this headline">¶</a></h2>
- <p>主视图代码如下:</p>
- <div class="highlight-python"><div class="highlight"><pre><span class="nd">@app.route</span><span class="p">(</span><span class="s">'/'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">'GET'</span><span class="p">,</span> <span class="s">'POST'</span><span class="p">])</span>
- <span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
- <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">'-id'</span><span class="p">)</span>
- <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>
- <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">'POST'</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>
- <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>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">t</span><span class="o">.</span><span class="n">store_to_db</span><span class="p">()</span>
- <span class="n">flash</span><span class="p">(</span><span class="s">u"添加成功"</span><span class="p">)</span>
- <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">'next'</span><span class="p">)</span> <span class="ow">or</span> <span class="n">url_for</span><span class="p">(</span><span class="s">'index'</span><span class="p">))</span>
- <span class="k">except</span><span class="p">:</span>
- <span class="n">flash</span><span class="p">(</span><span class="s">u'存储失败!'</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">'index.html'</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>
- </pre></div>
- </div>
- </div>
- <div class="section" id="id18">
- <h2>编辑视图<a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h2>
- <div class="highlight-python"><div class="highlight"><pre><span class="nd">@app.route</span><span class="p">(</span><span class="s">'/<int:id>/edit'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">'GET'</span><span class="p">,</span> <span class="s">'POST'</span><span class="p">])</span>
- <span class="k">def</span> <span class="nf">edit</span><span class="p">(</span><span class="nb">id</span><span class="p">):</span>
- <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>
- <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>
- <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">'POST'</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>
- <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">'title'</span><span class="p">]})</span>
- <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>
- <span class="n">flash</span><span class="p">(</span><span class="s">u"记录编辑成功"</span><span class="p">)</span>
- <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">'index'</span><span class="p">))</span>
- <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">'edit.html'</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>
- </pre></div>
- </div>
- </div>
- <div class="section" id="id19">
- <h2>删除视图<a class="headerlink" href="#id19" title="Permalink to this headline">¶</a></h2>
- <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>
- <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>
- <span class="k">if</span> <span class="n">todo</span><span class="p">:</span>
- <span class="n">todo</span><span class="o">.</span><span class="n">delete_todo</span><span class="p">()</span>
- <span class="n">flash</span><span class="p">(</span><span class="s">u"记录删除成功"</span><span class="p">)</span>
- <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">'index'</span><span class="p">))</span>
- </pre></div>
- </div>
- </div>
- <div class="section" id="id20">
- <h2>完成视图<a class="headerlink" href="#id20" title="Permalink to this headline">¶</a></h2>
- <div class="highlight-python"><pre>@app.route('/<int:id>/done')
- def done(id):
- todo = Todo.query.filter_by(id=id).first()
- if todo:
- Todo.query.filter_by(id=id).update({Todo.status:True})
- db.session.commit()
- flash(u"任务完成")
- return redirect(url_for('index'))</pre>
- </div>
- </div>
- <div class="section" id="id21">
- <h2>重置视图<a class="headerlink" href="#id21" title="Permalink to this headline">¶</a></h2>
- <div class="highlight-python"><div class="highlight"><pre><span class="nd">@app.route</span><span class="p">(</span><span class="s">'/<int:id>/redo'</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">redo</span><span class="p">(</span><span class="nb">id</span><span class="p">):</span>
- <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>
- <span class="k">if</span> <span class="n">todo</span><span class="p">:</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">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>
- <span class="n">flash</span><span class="p">(</span><span class="s">u"记录重置成功"</span><span class="p">)</span>
- <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>
- <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">'index'</span><span class="p">))</span>
- </pre></div>
- </div>
- </div>
- <div class="section" id="id22">
- <h2>404视图<a class="headerlink" href="#id22" title="Permalink to this headline">¶</a></h2>
- <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>
- <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>
- <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">'page_404.html'</span><span class="p">),</span> <span class="mi">404</span>
- </pre></div>
- </div>
- </div>
- <div class="section" id="id23">
- <h2>整个代码<a class="headerlink" href="#id23" title="Permalink to this headline">¶</a></h2>
- <div class="highlight-python"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/usr/bin/env python</span>
- <span class="c">#coding:utf-8</span>
- <span class="kn">import</span> <span class="nn">os</span>
- <span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
- <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>
- <span class="kn">from</span> <span class="nn">flaskext.sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
- <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>
- <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
- <span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="s">'7</span><span class="se">\xe9\xcf\x17\x11\x92</span><span class="s">I^"|</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'</span>
- <span class="n">SQLALCHEMY_DATABASE_URI</span> <span class="o">=</span> <span class="s">'sqlite:///todo.sqlite'</span>
- <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>
- <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>
- <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>
- <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>
- <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>
- <span class="sd">'''数据模型'''</span>
-
- <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>
- <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>
- <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>
- <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>
- <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>
- <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>
- <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="s">"<Todo '</span><span class="si">%s</span><span class="s">'>"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">title</span>
- <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>
- <span class="sd">'''保存数据到数据库'''</span>
-
- <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>
- <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>
- <span class="k">def</span> <span class="nf">delete_todo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">'''删除数据'''</span>
-
- <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>
- <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>
- <span class="k">class</span> <span class="nc">TodoForm</span><span class="p">(</span><span class="n">Form</span><span class="p">):</span>
- <span class="sd">'''表单'''</span>
-
- <span class="n">title</span> <span class="o">=</span> <span class="n">TextField</span><span class="p">(</span><span class="s">u"内容"</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"任务内容"</span><span class="p">)])</span>
- <span class="c">#submit = SubmitField(u"Add")</span>
- <span class="nd">@app.route</span><span class="p">(</span><span class="s">'/'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">'GET'</span><span class="p">,</span> <span class="s">'POST'</span><span class="p">])</span>
- <span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
- <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">'-id'</span><span class="p">)</span>
- <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>
- <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">'POST'</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>
- <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>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">t</span><span class="o">.</span><span class="n">store_to_db</span><span class="p">()</span>
- <span class="n">flash</span><span class="p">(</span><span class="s">u"添加成功"</span><span class="p">)</span>
- <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">'next'</span><span class="p">)</span> <span class="ow">or</span> <span class="n">url_for</span><span class="p">(</span><span class="s">'index'</span><span class="p">))</span>
- <span class="k">except</span><span class="p">:</span>
- <span class="n">flash</span><span class="p">(</span><span class="s">u'存储失败!'</span><span class="p">)</span>
-
- <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">'index.html'</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>
- <span class="nd">@app.route</span><span class="p">(</span><span class="s">'/<int:id>/del'</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">tdel</span><span class="p">(</span><span class="nb">id</span><span class="p">):</span>
- <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>
- <span class="k">if</span> <span class="n">todo</span><span class="p">:</span>
- <span class="n">todo</span><span class="o">.</span><span class="n">delete_todo</span><span class="p">()</span>
- <span class="n">flash</span><span class="p">(</span><span class="s">u"记录删除成功"</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">