<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Real Python]]></title>
  <link href="https://realpython.com/atom.xml" rel="self"/>
  <link href="https://realpython.com/"/>
  <updated>2014-08-26T06:58:43-07:00</updated>
  <id>https://realpython.com/</id>
  <author>
    <name><![CDATA[Real Python]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Django and AJAX Form Submissions - say 'goodbye' to the page refresh]]></title>
    <link href="https://realpython.com/blog/python/django-and-ajax-form-submissions/"/>
    <updated>2014-08-25T07:28:36-07:00</updated>
    <id>https://realpython.com/blog/python/django-and-ajax-form-submissions</id>
    <content type="html"><![CDATA[<p>This is a collaboration piece between Real Python and the mighty Nathan Nichols, using a collaborative method we have dubbed &lsquo;agile blogging`. Say &#8216;hi&rsquo; <a href="http://twitter.com/natsamnic">@natsamnic</a>.</p>

<hr>


<p>Let&rsquo;s get down to business:</p>

<ol>
<li>Download the compressed pre-ajax Django Project from the <a href="https://github.com/realpython/django-form-fun">repo</a></li>
<li>Activate a virtualenv</li>
<li>Install the requirements</li>
<li>Sync the database</li>
<li>Fire up the server</li>
</ol>


<p>Once logged in, test out the form. What we have here is a <em>simple</em> communication app with just create rights. It looks nice, but there&rsquo;s one annoying issue: The page refresh. How do we get rid of it? Or, how do we update just a <em>portion</em> of a webpage without having to refresh the <em>entire</em> page? Enter AJAX. AJAX is a client-side technology used for making asynchronous requests to the server-side &ndash; i.e., requesting or submitting data &ndash; where the subsequent responses do not cause an entire page refresh.</p>

<p><img src="https://raw.githubusercontent.com/realpython/django-form-fun/master/overview.png" alt="ajax-overview" /></p>

<blockquote><p>This tutorial assumes you have working knowledge of Django as well as <strong>some</strong> experience with JavaScript/jQuery. You should also be familiar with the basic HTTP methods, particularly GET and POST. Need to get up to speed? Get <a href="http://realpython.com">Real Python</a>.</p></blockquote>

<a name="Use.Protection"></a>
<h2>Use Protection</h2>

<p>Regardless of whether you&rsquo;re using AJAX or not, forms are at risk for Cross Site Request Forgeries (CSRF) attacks.</p>

<blockquote><p>Read more about CSRF attacks on the <a href="http://blog.codinghorror.com/preventing-csrf-and-xsrf-attacks/">Coding Horror</a> blog. They&rsquo;ve got a great article.</p></blockquote>

<p>To prevent such attacks, you must add the  <code>{% csrf_token %}</code> template tag to the form, which adds a hidden input field containing a token that gets sent with each POST request.</p>

<p>If you look at the <em>talk/index.html</em> template, you can see that we have already included this token. However, when it comes to AJAX requests, we need to add a bit more code, because we cannot pass that token using a JavaScript object since the scripts are static.</p>

<p>To get around this, we need to create a custom header that includes the token to watch our back. Simply grab the code <a href="https://gist.github.com/broinjc/db6e0ac214c355c887e5">here</a> and add it to the end of the <em>main.js</em> file. Yes, it&rsquo;s a lot of code. We could go through it line-by-line, but that&rsquo;s not the point of this post. Just trust us that it works.</p>

<p>Moving on&hellip;</p>

<a name="Handling.Events"></a>
<h2>Handling Events</h2>

<p>Before we touch the AJAX code, we need to add an <a href="http://learn.jquery.com/events/handling-events/">event handler</a> to our JavaScript file using jQuery.</p>

<blockquote><p>Keep in mind that jQuery is JavaScript. It&rsquo;s simply a JavaScript library used to reduce the amount of code you need to write. This is a common area of confusion so just be mindful of this as you go through the remainder of this tutorial.</p></blockquote>

<p>Which event(s) do we need to &ldquo;handle&rdquo;? Since we&rsquo;re just working with creating a post at this point, we just need to add one handler to <em>main.js</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Submit post on submit</span>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#post-form&#39;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;submit&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">){</span>
</span><span class='line'>    <span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;form submitted!&quot;</span><span class="p">)</span>  <span class="c1">// sanity check</span>
</span><span class='line'>    <span class="nx">create_post</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here, when a user submits the form this function fires, which-</p>

<ol>
<li>Prevents the <a href="http://www.w3schools.com/jquery/event_preventdefault.asp">default browser behavior</a> for a form submission,</li>
<li>Logs &ldquo;form submitted!&rdquo; to the console, and</li>
<li>Calls a function called <code>create_post()</code> where the AJAX code will live.</li>
</ol>


<p>Make sure to add an id of <code>post-form</code> to the form on the <em>index.html</em> file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;form</span> <span class="na">action=</span><span class="s">&quot;/create_post/&quot;</span> <span class="na">method=</span><span class="s">&quot;POST&quot;</span> <span class="na">id=</span><span class="s">&quot;post-form&quot;</span><span class="nt">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And add a link to the JavaScript file to the bottom of the template:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;static/scripts/main.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Test this out. Fire up the server, then open your JavaScript console. You should see the following when you submit the form:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>form submitted!
</span><span class='line'>Uncaught ReferenceError: create_post is not defined
</span></code></pre></td></tr></table></div></figure>


<p>This is exactly what we should see: The form submission is handled correctly, since &ldquo;form submitted!&rdquo; is displayed and the <code>create_post</code> function is called. Now we just need to add that function.</p>

<a name="Adding.AJAX"></a>
<h2>Adding AJAX</h2>

<p>Let&rsquo;s develop one last iteration before we add the actual AJAX code.</p>

<a name="Update..em.main.js..em.:"></a>
<h3>Update <em>main.js</em>:</h3>

<p>Add the <code>create_post</code> function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// AJAX for posting</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">create_post</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;create post is working!&quot;</span><span class="p">)</span> <span class="c1">// sanity check</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#post-text&#39;</span><span class="p">).</span><span class="nx">val</span><span class="p">())</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Again, we ran a sanity check to ensure the function is called correctly, then we grab the input value of the form. For this to work correctly we need to add an id to the form field:</p>

<a name="Update..em.forms.py..em.:"></a>
<h3>Update <em>forms.py</em>:</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">PostForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">ModelForm</span><span class="p">):</span>
</span><span class='line'>    <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
</span><span class='line'>        <span class="n">model</span> <span class="o">=</span> <span class="n">Post</span>
</span><span class='line'>        <span class="c"># exclude = [&#39;author&#39;, &#39;updated&#39;, &#39;created&#39;, ]</span>
</span><span class='line'>        <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;text&#39;</span><span class="p">]</span>
</span><span class='line'>        <span class="n">widgets</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>            <span class="s">&#39;text&#39;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">TextInput</span><span class="p">(</span>
</span><span class='line'>                <span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;id&#39;</span><span class="p">:</span> <span class="s">&#39;post-text&#39;</span><span class="p">,</span> <span class="s">&#39;required&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span> <span class="s">&#39;placeholder&#39;</span><span class="p">:</span> <span class="s">&#39;Say something...&#39;</span><span class="p">}</span>
</span><span class='line'>            <span class="p">),</span>
</span><span class='line'>        <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice how we also added a placeholder to the field and made it required along with the id. We could add some error handlers to the form template or simply let HTML5 handle it. Let&rsquo;s use the latter.</p>

<p>Test again. Submit the form with the word &ldquo;test&rdquo;. You should see the following in your console:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">form</span> <span class="n">submitted</span><span class="err">!</span>
</span><span class='line'><span class="n">create</span> <span class="n">post</span> <span class="ow">is</span> <span class="n">working</span><span class="err">!</span>
</span><span class='line'><span class="n">test</span>
</span></code></pre></td></tr></table></div></figure>


<p>Sweet. So, we&rsquo;ve confirmed that we&rsquo;re calling the <code>create_post()</code> function correctly as well as grabbing the value of the form input. Now let&rsquo;s wire in some AJAX to submit the POST request.</p>

<a name="Update..em.main.js..em.:"></a>
<h3>Update <em>main.js</em>:</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// AJAX for posting</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">create_post</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;create post is working!&quot;</span><span class="p">)</span> <span class="c1">// sanity check</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">url</span> <span class="o">:</span> <span class="s2">&quot;create_post/&quot;</span><span class="p">,</span> <span class="c1">// the endpoint</span>
</span><span class='line'>        <span class="nx">type</span> <span class="o">:</span> <span class="s2">&quot;POST&quot;</span><span class="p">,</span> <span class="c1">// http method</span>
</span><span class='line'>        <span class="nx">data</span> <span class="o">:</span> <span class="p">{</span> <span class="nx">the_post</span> <span class="o">:</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#post-text&#39;</span><span class="p">).</span><span class="nx">val</span><span class="p">()</span> <span class="p">},</span> <span class="c1">// data sent with the post request</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// handle a successful response</span>
</span><span class='line'>        <span class="nx">success</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">json</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#post-text&#39;</span><span class="p">).</span><span class="nx">val</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">);</span> <span class="c1">// remove the value from the input</span>
</span><span class='line'>            <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">json</span><span class="p">);</span> <span class="c1">// log the returned json to the console</span>
</span><span class='line'>            <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;success&quot;</span><span class="p">);</span> <span class="c1">// another sanity check</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// handle a non-successful response</span>
</span><span class='line'>        <span class="nx">error</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">xhr</span><span class="p">,</span><span class="nx">errmsg</span><span class="p">,</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#results&#39;</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="s2">&quot;&lt;div class=&#39;alert-box alert radius&#39; data-alert&gt;Oops! We have encountered an error: &quot;</span><span class="o">+</span><span class="nx">errmsg</span><span class="o">+</span>
</span><span class='line'>                <span class="s2">&quot; &lt;a href=&#39;#&#39; class=&#39;close&#39;&gt;&amp;times;&lt;/a&gt;&lt;/div&gt;&quot;</span><span class="p">);</span> <span class="c1">// add the error to the dom</span>
</span><span class='line'>            <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">xhr</span><span class="p">.</span><span class="nx">status</span> <span class="o">+</span> <span class="s2">&quot;: &quot;</span> <span class="o">+</span> <span class="nx">xhr</span><span class="p">.</span><span class="nx">responseText</span><span class="p">);</span> <span class="c1">// provide a bit more info about the error to the console</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>What&rsquo;s happening? Well, we submit form data to the <code>create_post/</code> endpoint, then wait for one of two responses &ndash; either a success or a failure&hellip;. Follow the code comments for a more detailed explanation.</p>

<a name="Update.the.views"></a>
<h3>Update the views</h3>

<p>Now let&rsquo;s update our views to handle the POST request correctly:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">create_post</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
</span><span class='line'>    <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="p">:</span>
</span><span class='line'>        <span class="n">post_text</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;the_post&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="n">response_data</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">post</span> <span class="o">=</span> <span class="n">Post</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">post_text</span><span class="p">,</span> <span class="n">author</span><span class="o">=</span><span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
</span><span class='line'>        <span class="n">post</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">response_data</span><span class="p">[</span><span class="s">&#39;result&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;Create post successful!&#39;</span>
</span><span class='line'>        <span class="n">response_data</span><span class="p">[</span><span class="s">&#39;postpk&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">post</span><span class="o">.</span><span class="n">pk</span>
</span><span class='line'>        <span class="n">response_data</span><span class="p">[</span><span class="s">&#39;text&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">post</span><span class="o">.</span><span class="n">text</span>
</span><span class='line'>        <span class="n">response_data</span><span class="p">[</span><span class="s">&#39;created&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">post</span><span class="o">.</span><span class="n">created</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">&#39;%B </span><span class="si">%d</span><span class="s">, %Y %I:%M %p&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="n">response_data</span><span class="p">[</span><span class="s">&#39;author&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">post</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">username</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(</span>
</span><span class='line'>            <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">response_data</span><span class="p">),</span>
</span><span class='line'>            <span class="n">content_type</span><span class="o">=</span><span class="s">&quot;application/json&quot;</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>    <span class="k">else</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(</span>
</span><span class='line'>            <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">({</span><span class="s">&quot;nothing to see&quot;</span><span class="p">:</span> <span class="s">&quot;this isn&#39;t happening&quot;</span><span class="p">}),</span>
</span><span class='line'>            <span class="n">content_type</span><span class="o">=</span><span class="s">&quot;application/json&quot;</span>
</span><span class='line'>        <span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here we grab the post text along with the author and update the database. Then we create a response dict, serialize it into JSON, and then send it as the response &ndash; which gets logged to the console in the success handler: <code>console.log(json)</code>, as you saw in the <code>create_post()</code> function in the JavaScript file above.</p>

<p>Test this again.</p>

<p>You should see the object in the console:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">form</span> <span class="n">submitted</span><span class="err">!</span>
</span><span class='line'><span class="n">create</span> <span class="n">post</span> <span class="ow">is</span> <span class="n">working</span><span class="err">!</span>
</span><span class='line'><span class="n">Object</span> <span class="p">{</span><span class="n">text</span><span class="p">:</span> <span class="s">&quot;hey!&quot;</span><span class="p">,</span> <span class="n">author</span><span class="p">:</span> <span class="s">&quot;michael&quot;</span><span class="p">,</span> <span class="n">postpk</span><span class="p">:</span> <span class="mi">15</span><span class="p">,</span> <span class="n">result</span><span class="p">:</span> <span class="s">&quot;Create post successful!&quot;</span><span class="p">,</span> <span class="n">created</span><span class="p">:</span> <span class="s">&quot;August 22, 2014 10:55 PM&quot;</span><span class="p">}</span>
</span><span class='line'><span class="n">success</span>
</span></code></pre></td></tr></table></div></figure>


<p>How about we add the JSON to the DOM!</p>

<a name="Updating.the.DOM"></a>
<h2>Updating the DOM</h2>

<a name="Update.the.template"></a>
<h3>Update the template</h3>

<p>Simply add an id of &ldquo;talk&rdquo; to the <code>&lt;ul&gt;</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;ul</span> <span class="na">id=</span><span class="s">&quot;talk&quot;</span><span class="nt">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then update the form so that errors will be added:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;form</span> <span class="na">method=</span><span class="s">&quot;POST&quot;</span> <span class="na">id=</span><span class="s">&quot;post-form&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    {% csrf_token %}
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;fieldWrapper&quot;</span> <span class="na">id=</span><span class="s">&quot;the_post&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        {{ form.text }}
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;results&quot;</span><span class="nt">&gt;&lt;/div&gt;</span> <span class="c">&lt;!-- errors go here --&gt;</span>
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">value=</span><span class="s">&quot;Post&quot;</span> <span class="na">class=</span><span class="s">&quot;tiny button&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;/form&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<a name="Update..em.main.js..em."></a>
<h3>Update <em>main.js</em></h3>

<p>Now we can add the JSON to the DOM where that new &ldquo;talk&rdquo; id is:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">success</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">json</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#post-text&#39;</span><span class="p">).</span><span class="nx">val</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">);</span> <span class="c1">// remove the value from the input</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">json</span><span class="p">);</span> <span class="c1">// log the returned json to the console</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#talk&quot;</span><span class="p">).</span><span class="nx">prepend</span><span class="p">(</span><span class="s2">&quot;&lt;li&gt;&lt;strong&gt;&quot;</span><span class="o">+</span><span class="nx">json</span><span class="p">.</span><span class="nx">text</span><span class="o">+</span><span class="s2">&quot;&lt;/strong&gt; - &lt;em&gt; &quot;</span><span class="o">+</span><span class="nx">json</span><span class="p">.</span><span class="nx">author</span><span class="o">+</span><span class="s2">&quot;&lt;/em&gt; - &lt;span&gt; &quot;</span><span class="o">+</span><span class="nx">json</span><span class="p">.</span><span class="nx">created</span><span class="o">+</span><span class="s2">&quot;&lt;/span&gt;&lt;/li&gt;&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;success&quot;</span><span class="p">);</span> <span class="c1">// another sanity check</span>
</span><span class='line'><span class="p">},</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ready to see this in action? Test it out!</p>

<p><img src="https://raw.githubusercontent.com/realpython/nate/master/django-ajax-form/convo.png?token=2018167__eyJzY29wZSI6IlJhd0Jsb2I6cmVhbHB5dGhvbi9uYXRlL21hc3Rlci9kamFuZ28tYWpheC1mb3JtL2NvbnZvLnBuZyIsImV4cGlyZXMiOjE0MDkzNTY2NjJ9--d4aeb1a1ff3362c1750728adbb6fed2000a2df44" alt="convo_app" /></p>

<p>If you&rsquo;d like to see what an error looks like, then comment out all the CSRF Javascript in <em>main.js</em> and then try to submit the form.</p>

<a name="Rinse..Repeat"></a>
<h2>Rinse, Repeat</h2>

<p>Your turn. We need to handle some more events. With your new found knowledge of jQuery and AJAX, you get to put these into place. I added code to the final app &ndash; which you can download <a href="https://github.com/realpython/django-form-fun">here</a> &ndash; that includes a delete link. You just need to add an event to handle the click, which then calls a function that uses AJAX to send a POST request to the back-end to delete the post from the database. Follow the same workflow as I did in this tutorial. We&rsquo;ll post the answer to this next time.</p>

<p>If you get stuck, and can&rsquo;t debug the errors, follow this workflow &ndash;</p>

<ol>
<li>Use the &ldquo;Google-it-first&rdquo; algorithm</li>
<li>Struggle. Spin your wheels. Set the code aside. Run around the block. Then come back to it.</li>
<li>Still stuck? Comment below, stating first the problem and then detailing the steps you&rsquo;ve taken to solve the problem thus far</li>
</ol>


<p>Be sure to <em>try</em> troubleshooting on your own before asking for help. Spinning your wheels, hacking away at a solution will benefit you in the long run. It&rsquo;s the process that matters, not so much the solution. It&rsquo;s part of what separates poor developers from great developers. Good luck.</p>

<a name="Conclusion"></a>
<h2>Conclusion</h2>

<p>How does your app look? Ready for more?</p>

<ol>
<li>AJAX is <em>so</em> yesterday. We can do a lot more with much less code using AngularJS.</li>
<li>In most cases, it&rsquo;s a standard to couple the client-side JavaScript, whether it&rsquo;s AJAX or Angular or some other framework, with a server-side RESTful API.</li>
<li>Where&rsquo;s the tests?</li>
</ol>


<p>What would you like to see next? Comment below. Cheers!</p>

<p>Happy coding!</p>

<p><a href="https://github.com/realpython/django-form-fun">Link to repo</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Flask by Example - Part 3 - Text Processing with Requests, BeautifulSoup, and NLTK]]></title>
    <link href="https://realpython.com/blog/python/flask-by-example-part-3-text-processing-with-requests-beautifulsoup-nltk/"/>
    <updated>2014-08-18T06:18:37-07:00</updated>
    <id>https://realpython.com/blog/python/flask-by-example-part-3-text-processing-with-requests-beautifulsoup-nltk</id>
    <content type="html"><![CDATA[<p><em>The following is a guest post by Cam Linke, co-founder of <a href="http://startupedmonton.com/">Startup Edmonton</a>.</em></p>

<br>


<p>In this section, we&rsquo;re going scrape the contents of a webpage that the user enters and then process the text to display the number of times a word occurs.</p>

<p><strong>Remember, here&rsquo;s what we&rsquo;re building: A Flask app with a simple text box. When you enter text into the box, the app processes then displays a count of how many times each word appears on the page.</strong></p>

<ol>
<li><a href="http://www.realpython.com/blog/python/flask-by-example-part-1-project-setup">Part One</a>: Setup a local development environment and then deploy both a staging environment and a production environment on Heroku.</li>
<li><a href="http://www.realpython.com/blog/flask-by-example-part-2-postgres-sqlalchemy-and-alembic">Part Two</a>: Setup a PostgreSQL database along with SQLAlchemy and Alembic to handle migrations.</li>
<li><strong>Part Three: Add in the back-end logic to scrape and then process the counting of words from a webpage using the requests, BeautifulSoup, and Natural Language Toolkit (NLTK) libraries. (current)</strong></li>
<li>Part Four: Implement a request queue backed by Redis to handle the actual text processing.</li>
<li>Part Five: Setup Angular on the front-end to continuously poll the back-end to see if the request is done.</li>
<li>Part Six: Add the D3 library into the mix to graph a frequency distribution and histogram.</li>
</ol>


<blockquote><p>Need the code? Grab it from the <a href="https://github.com/realpython/flask-by-example">repo</a>.</p></blockquote>

<a name="Install.Requirements"></a>
<h2>Install Requirements</h2>

<p>Tools we&rsquo;ll use in this part:</p>

<ul>
<li><strong>requests</strong> &ndash; <a href="http://docs.python-requests.org/en/latest/">http://docs.python-requests.org/en/latest/</a></li>
<li><strong>BeautifulSoup</strong> &ndash; <a href="http://www.crummy.com/software/BeautifulSoup/">http://www.crummy.com/software/BeautifulSoup/</a></li>
<li><strong>NLTK</strong> &ndash; <a href="http://www.nltk.org/">http://www.nltk.org/</a></li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>workon wordcounts
</span><span class='line'><span class="nv">$ </span>pip install requests nltk beautifulsoup4
</span><span class='line'><span class="nv">$ </span>pip freeze &gt; requirements.txt
</span></code></pre></td></tr></table></div></figure>


<a name="Refactor.the.Index.Route"></a>
<h2>Refactor the Index Route</h2>

<p>To get started let&rsquo;s get rid of the &ldquo;hello world&rdquo; part of the index route in our <em>app.py</em> file and set up the route to render a form to accept URLs. First, add a templates folder to hold our templates and add an <em>index.html</em> file to it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>mkdir templates
</span><span class='line'><span class="nv">$ </span><span class="nb">cd </span>templates
</span><span class='line'><span class="nv">$ </span>touch index.html
</span></code></pre></td></tr></table></div></figure>


<p>Set up a very basic HTML page:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>  <span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>Wordcount<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">name=</span><span class="s">&quot;viewport&quot;</span> <span class="na">content=</span><span class="s">&quot;width=device-width, initial-scale=1.0&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">&quot;http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css&quot;</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">media=</span><span class="s">&quot;screen&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;style&gt;</span>
</span><span class='line'>      <span class="nc">.container</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">max-width</span><span class="o">:</span> <span class="m">1000px</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="nt">&lt;/style&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;h1&gt;</span>Wordcount 3000<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>      <span class="nt">&lt;form</span> <span class="na">role=</span><span class="s">&quot;form&quot;</span> <span class="na">method=</span><span class="s">&#39;POST&#39;</span> <span class="na">action=</span><span class="s">&#39;/&#39;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;form-group&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>          <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">class=</span><span class="s">&quot;form-control&quot;</span> <span class="na">id=</span><span class="s">&quot;url-box&quot;</span> <span class="na">placeholder=</span><span class="s">&quot;Enter URL...&quot;</span> <span class="na">style=</span><span class="s">&quot;max-width: 300px;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;button</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">class=</span><span class="s">&quot;btn btn-default&quot;</span><span class="nt">&gt;</span>Submit<span class="nt">&lt;/button&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/form&gt;</span>
</span><span class='line'>      <span class="nt">&lt;br&gt;</span>
</span><span class='line'>      {% for error in errors %}
</span><span class='line'>        <span class="nt">&lt;h4&gt;</span>{{ error }}<span class="nt">&lt;/h4&gt;</span>
</span><span class='line'>      {% endfor %}
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;http://code.jquery.com/jquery-1.11.0.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>We use <a href="http://getbootstrap.com/">Bootstrap</a> to add a bit of style so our page isn&rsquo;t completely hideous. Then add a form with a text box for users to enter a URL. Additionally, we utilize a Jinja <code>for</code> loop to iterate through a list of errors, displaying each one.</p>

<p>Update the <em>app.py</em> file to serve the template:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><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><span class='line'><span class="kn">from</span> <span class="nn">flask.ext.sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">os</span>
</span><span class='line'>
</span><span class='line'><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><span class='line'><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">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;APP_SETTINGS&#39;</span><span class="p">])</span>
</span><span class='line'><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><span class='line'>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'><span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
</span><span class='line'>    <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><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Why both HTTP methods? Well, we will eventually use that same route for both GET and POST requests &ndash; to serve the <em>index.html</em> page and handle form submissions, respectively.</p>

<p>Fire up the app to test it out:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python manage.py runserver
</span></code></pre></td></tr></table></div></figure>


<p>Navigate to <a href="http://localhost:5000/">http://localhost:5000/</a> and you should see the form staring back at you.</p>

<a name="Requests"></a>
<h2>Requests</h2>

<p>Now let&rsquo;s use the <a href="http://docs.python-requests.org/en/latest/">requests</a> library to grab the HTML page from the submitted URL.</p>

<p>Change your index route to the following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><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>
</span><span class='line'><span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
</span><span class='line'>    <span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
</span><span class='line'>    <span class="n">results</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'>    <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">&quot;POST&quot;</span><span class="p">:</span>
</span><span class='line'>        <span class="c"># get url that the user has entered</span>
</span><span class='line'>        <span class="k">try</span><span class="p">:</span>
</span><span class='line'>            <span class="n">url</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s">&#39;url&#39;</span><span class="p">]</span>
</span><span class='line'>            <span class="k">print</span> <span class="n">url</span><span class="p">[:</span><span class="mi">7</span><span class="p">]</span>
</span><span class='line'>            <span class="k">if</span> <span class="s">&#39;http://&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">url</span><span class="p">[:</span><span class="mi">7</span><span class="p">]:</span>
</span><span class='line'>                <span class="n">url</span> <span class="o">=</span> <span class="s">&#39;http://&#39;</span> <span class="o">+</span> <span class="n">url</span>
</span><span class='line'>            <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
</span><span class='line'>            <span class="k">print</span> <span class="n">r</span><span class="o">.</span><span class="n">text</span>
</span><span class='line'>        <span class="k">except</span><span class="p">:</span>
</span><span class='line'>            <span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span><span class='line'>                <span class="s">&quot;Unable to get URL. Please make sure it&#39;s valid and try again.&quot;</span>
</span><span class='line'>            <span class="p">)</span>
</span><span class='line'>    <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">errors</span><span class="o">=</span><span class="n">errors</span><span class="p">,</span> <span class="n">results</span><span class="o">=</span><span class="n">results</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Make sure to update the imports as well:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><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">request</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask.ext.sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">os</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">requests</span>
</span></code></pre></td></tr></table></div></figure>


<ol>
<li>Here, we import the <code>requests</code> library as well as the <code>request</code> object from Flask. The former is used to scrape the specific user-provided URL, while the latter is used to handle GET and POST requests in Flask.</li>
<li>Next we add variables to capture both errors and results, which are passed into the template.</li>
<li><p>Within the view itself, we check if the request is a POST-</p>

<ul>
<li>If POST: Grab the value from the form and assign it to the <code>url</code> variable. Then we do some clean-up on the URL to add &lsquo;<a href="http://">http://</a>&rsquo; if it&rsquo;s not part of the submitted URL. Finally, we add an exception to handle any errors and append a generic error message to the <code>errors</code> list. We then render the template, including the <code>errors</code> list and <code>results</code> dictionary.</li>
<li>If GET: We simply render the template.</li>
</ul>
</li>
</ol>


<p><strong>Let&rsquo;s test this out:</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="err">$</span> <span class="n">python</span> <span class="n">manage</span><span class="o">.</span><span class="n">py</span> <span class="n">runserver</span>
</span></code></pre></td></tr></table></div></figure>


<p>You should be able to type in a web page and in the console you&rsquo;ll see the text of that webpage returned (as long as it&rsquo;s a valid page, of course).</p>

<a name="Text.Processing"></a>
<h2>Text Processing</h2>

<p>With the HTML in hand, let&rsquo;s now count the frequency of the words that are on the page and display them to the end user. Update your code to the following and we&rsquo;ll walk through what&rsquo;s happening:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><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">request</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask.ext.sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">stop_words</span> <span class="kn">import</span> <span class="n">stops</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">Counter</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">operator</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">os</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">requests</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">re</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">nltk</span>
</span><span class='line'>
</span><span class='line'><span class="c">#######################</span>
</span><span class='line'><span class="c">#### configuration ####</span>
</span><span class='line'><span class="c">#######################</span>
</span><span class='line'>
</span><span class='line'><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><span class='line'><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">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;APP_SETTINGS&#39;</span><span class="p">])</span>
</span><span class='line'><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><span class='line'>
</span><span class='line'><span class="kn">from</span> <span class="nn">models</span> <span class="kn">import</span> <span class="n">Result</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="c">################</span>
</span><span class='line'><span class="c">#### routes ####</span>
</span><span class='line'><span class="c">################</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'><span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
</span><span class='line'>    <span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
</span><span class='line'>    <span class="n">results</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'>    <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">&quot;POST&quot;</span><span class="p">:</span>
</span><span class='line'>        <span class="c"># get url that the person has entered</span>
</span><span class='line'>        <span class="k">try</span><span class="p">:</span>
</span><span class='line'>            <span class="n">url</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s">&#39;url&#39;</span><span class="p">]</span>
</span><span class='line'>            <span class="k">if</span> <span class="s">&#39;http://&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">url</span><span class="p">[:</span><span class="mi">7</span><span class="p">]:</span>
</span><span class='line'>                <span class="n">url</span> <span class="o">=</span> <span class="s">&#39;http://&#39;</span> <span class="o">+</span> <span class="n">url</span>
</span><span class='line'>            <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
</span><span class='line'>        <span class="k">except</span><span class="p">:</span>
</span><span class='line'>            <span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span><span class='line'>                <span class="s">&quot;Unable to get URL. Please make sure it&#39;s valid and try again.&quot;</span>
</span><span class='line'>            <span class="p">)</span>
</span><span class='line'>            <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">errors</span><span class="o">=</span><span class="n">errors</span><span class="p">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">r</span><span class="p">:</span>
</span><span class='line'>
</span><span class='line'>            <span class="c"># text processing</span>
</span><span class='line'>            <span class="n">raw</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">)</span><span class="o">.</span><span class="n">get_text</span><span class="p">()</span>
</span><span class='line'>            <span class="n">nltk</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&#39;./nltk_data/&#39;</span><span class="p">)</span>  <span class="c"># set the path</span>
</span><span class='line'>            <span class="n">tokens</span> <span class="o">=</span> <span class="n">nltk</span><span class="o">.</span><span class="n">word_tokenize</span><span class="p">(</span><span class="n">raw</span><span class="p">)</span>
</span><span class='line'>            <span class="n">text</span> <span class="o">=</span> <span class="n">nltk</span><span class="o">.</span><span class="n">Text</span><span class="p">(</span><span class="n">tokens</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>            <span class="c"># remove punctuation, count raw words</span>
</span><span class='line'>            <span class="n">nonPunct</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">&#39;.*[A-Za-z].*&#39;</span><span class="p">)</span>
</span><span class='line'>            <span class="n">raw_words</span> <span class="o">=</span> <span class="p">[</span><span class="n">w</span> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">text</span> <span class="k">if</span> <span class="n">nonPunct</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">w</span><span class="p">)]</span>
</span><span class='line'>            <span class="n">raw_word_count</span> <span class="o">=</span> <span class="n">Counter</span><span class="p">(</span><span class="n">raw_words</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>            <span class="c"># stop words</span>
</span><span class='line'>            <span class="n">no_stop_words</span> <span class="o">=</span> <span class="p">[</span><span class="n">w</span> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">raw_words</span> <span class="k">if</span> <span class="n">w</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">stops</span><span class="p">]</span>
</span><span class='line'>            <span class="n">no_stop_words_count</span> <span class="o">=</span> <span class="n">Counter</span><span class="p">(</span><span class="n">no_stop_words</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>            <span class="c"># save the results</span>
</span><span class='line'>            <span class="n">results</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span>
</span><span class='line'>                <span class="n">no_stop_words_count</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span>
</span><span class='line'>                <span class="n">key</span><span class="o">=</span><span class="n">operator</span><span class="o">.</span><span class="n">itemgetter</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span>
</span><span class='line'>                <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span>
</span><span class='line'>            <span class="p">)</span>
</span><span class='line'>            <span class="k">try</span><span class="p">:</span>
</span><span class='line'>                <span class="n">result</span> <span class="o">=</span> <span class="n">Result</span><span class="p">(</span>
</span><span class='line'>                    <span class="n">url</span><span class="o">=</span><span class="n">url</span><span class="p">,</span>
</span><span class='line'>                    <span class="n">result_all</span><span class="o">=</span><span class="n">raw_word_count</span><span class="p">,</span>
</span><span class='line'>                    <span class="n">result_no_stop_words</span><span class="o">=</span><span class="n">no_stop_words_count</span>
</span><span class='line'>                <span class="p">)</span>
</span><span class='line'>                <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="n">result</span><span class="p">)</span>
</span><span class='line'>                <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><span class='line'>            <span class="k">except</span><span class="p">:</span>
</span><span class='line'>                <span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&quot;Unable to add item to database.&quot;</span><span class="p">)</span>
</span><span class='line'>    <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">errors</span><span class="o">=</span><span class="n">errors</span><span class="p">,</span> <span class="n">results</span><span class="o">=</span><span class="n">results</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Create a new file called <em>stop_words.py</em> and add the following list:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">stops</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>    <span class="s">&#39;i&#39;</span><span class="p">,</span> <span class="s">&#39;me&#39;</span><span class="p">,</span> <span class="s">&#39;my&#39;</span><span class="p">,</span> <span class="s">&#39;myself&#39;</span><span class="p">,</span> <span class="s">&#39;we&#39;</span><span class="p">,</span> <span class="s">&#39;our&#39;</span><span class="p">,</span> <span class="s">&#39;ours&#39;</span><span class="p">,</span> <span class="s">&#39;ourselves&#39;</span><span class="p">,</span> <span class="s">&#39;you&#39;</span><span class="p">,</span>  <span class="s">&#39;your&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;yours&#39;</span><span class="p">,</span> <span class="s">&#39;yourself&#39;</span><span class="p">,</span> <span class="s">&#39;yourselves&#39;</span><span class="p">,</span> <span class="s">&#39;he&#39;</span><span class="p">,</span> <span class="s">&#39;him&#39;</span><span class="p">,</span> <span class="s">&#39;his&#39;</span><span class="p">,</span> <span class="s">&#39;himself&#39;</span><span class="p">,</span> <span class="s">&#39;she&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;her&#39;</span><span class="p">,</span> <span class="s">&#39;hers&#39;</span><span class="p">,</span> <span class="s">&#39;herself&#39;</span><span class="p">,</span> <span class="s">&#39;it&#39;</span><span class="p">,</span> <span class="s">&#39;its&#39;</span><span class="p">,</span> <span class="s">&#39;itself&#39;</span><span class="p">,</span> <span class="s">&#39;they&#39;</span><span class="p">,</span> <span class="s">&#39;them&#39;</span><span class="p">,</span> <span class="s">&#39;their&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;theirs&#39;</span><span class="p">,</span> <span class="s">&#39;themselves&#39;</span><span class="p">,</span> <span class="s">&#39;what&#39;</span><span class="p">,</span> <span class="s">&#39;which&#39;</span><span class="p">,</span> <span class="s">&#39;who&#39;</span><span class="p">,</span> <span class="s">&#39;whom&#39;</span><span class="p">,</span> <span class="s">&#39;this&#39;</span><span class="p">,</span> <span class="s">&#39;that&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;these&#39;</span><span class="p">,</span> <span class="s">&#39;those&#39;</span><span class="p">,</span> <span class="s">&#39;am&#39;</span><span class="p">,</span> <span class="s">&#39;is&#39;</span><span class="p">,</span> <span class="s">&#39;are&#39;</span><span class="p">,</span> <span class="s">&#39;was&#39;</span><span class="p">,</span> <span class="s">&#39;were&#39;</span><span class="p">,</span> <span class="s">&#39;be&#39;</span><span class="p">,</span> <span class="s">&#39;been&#39;</span><span class="p">,</span> <span class="s">&#39;being&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;have&#39;</span><span class="p">,</span> <span class="s">&#39;has&#39;</span><span class="p">,</span> <span class="s">&#39;had&#39;</span><span class="p">,</span>  <span class="s">&#39;having&#39;</span><span class="p">,</span> <span class="s">&#39;do&#39;</span><span class="p">,</span> <span class="s">&#39;does&#39;</span><span class="p">,</span> <span class="s">&#39;did&#39;</span><span class="p">,</span> <span class="s">&#39;doing&#39;</span><span class="p">,</span> <span class="s">&#39;a&#39;</span><span class="p">,</span> <span class="s">&#39;an&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;the&#39;</span><span class="p">,</span> <span class="s">&#39;and&#39;</span><span class="p">,</span> <span class="s">&#39;but&#39;</span><span class="p">,</span> <span class="s">&#39;if&#39;</span><span class="p">,</span> <span class="s">&#39;or&#39;</span><span class="p">,</span> <span class="s">&#39;because&#39;</span><span class="p">,</span> <span class="s">&#39;as&#39;</span><span class="p">,</span> <span class="s">&#39;until&#39;</span><span class="p">,</span> <span class="s">&#39;while&#39;</span><span class="p">,</span> <span class="s">&#39;of&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;at&#39;</span><span class="p">,</span> <span class="s">&#39;by&#39;</span><span class="p">,</span> <span class="s">&#39;for&#39;</span><span class="p">,</span> <span class="s">&#39;with&#39;</span><span class="p">,</span> <span class="s">&#39;about&#39;</span><span class="p">,</span> <span class="s">&#39;against&#39;</span><span class="p">,</span> <span class="s">&#39;between&#39;</span><span class="p">,</span> <span class="s">&#39;into&#39;</span><span class="p">,</span> <span class="s">&#39;through&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;during&#39;</span><span class="p">,</span> <span class="s">&#39;before&#39;</span><span class="p">,</span> <span class="s">&#39;after&#39;</span><span class="p">,</span> <span class="s">&#39;above&#39;</span><span class="p">,</span> <span class="s">&#39;below&#39;</span><span class="p">,</span> <span class="s">&#39;to&#39;</span><span class="p">,</span> <span class="s">&#39;from&#39;</span><span class="p">,</span> <span class="s">&#39;up&#39;</span><span class="p">,</span> <span class="s">&#39;down&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;in&#39;</span><span class="p">,</span> <span class="s">&#39;out&#39;</span><span class="p">,</span> <span class="s">&#39;on&#39;</span><span class="p">,</span> <span class="s">&#39;off&#39;</span><span class="p">,</span> <span class="s">&#39;over&#39;</span><span class="p">,</span> <span class="s">&#39;under&#39;</span><span class="p">,</span> <span class="s">&#39;again&#39;</span><span class="p">,</span> <span class="s">&#39;further&#39;</span><span class="p">,</span> <span class="s">&#39;then&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;once&#39;</span><span class="p">,</span> <span class="s">&#39;here&#39;</span><span class="p">,</span> <span class="s">&#39;there&#39;</span><span class="p">,</span> <span class="s">&#39;when&#39;</span><span class="p">,</span> <span class="s">&#39;where&#39;</span><span class="p">,</span> <span class="s">&#39;why&#39;</span><span class="p">,</span> <span class="s">&#39;how&#39;</span><span class="p">,</span> <span class="s">&#39;all&#39;</span><span class="p">,</span> <span class="s">&#39;any&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;both&#39;</span><span class="p">,</span> <span class="s">&#39;each&#39;</span><span class="p">,</span> <span class="s">&#39;few&#39;</span><span class="p">,</span> <span class="s">&#39;more&#39;</span><span class="p">,</span> <span class="s">&#39;most&#39;</span><span class="p">,</span> <span class="s">&#39;other&#39;</span><span class="p">,</span> <span class="s">&#39;some&#39;</span><span class="p">,</span> <span class="s">&#39;such&#39;</span><span class="p">,</span> <span class="s">&#39;no&#39;</span><span class="p">,</span> <span class="s">&#39;nor&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;not&#39;</span><span class="p">,</span> <span class="s">&#39;only&#39;</span><span class="p">,</span> <span class="s">&#39;own&#39;</span><span class="p">,</span> <span class="s">&#39;same&#39;</span><span class="p">,</span> <span class="s">&#39;so&#39;</span><span class="p">,</span> <span class="s">&#39;than&#39;</span><span class="p">,</span> <span class="s">&#39;too&#39;</span><span class="p">,</span> <span class="s">&#39;very&#39;</span><span class="p">,</span> <span class="s">&#39;s&#39;</span><span class="p">,</span> <span class="s">&#39;t&#39;</span><span class="p">,</span> <span class="s">&#39;can&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;will&#39;</span><span class="p">,</span> <span class="s">&#39;just&#39;</span><span class="p">,</span> <span class="s">&#39;don&#39;</span><span class="p">,</span> <span class="s">&#39;should&#39;</span><span class="p">,</span> <span class="s">&#39;now&#39;</span><span class="p">,</span> <span class="s">&#39;id&#39;</span><span class="p">,</span> <span class="s">&#39;var&#39;</span><span class="p">,</span> <span class="s">&#39;function&#39;</span><span class="p">,</span> <span class="s">&#39;js&#39;</span><span class="p">,</span> <span class="s">&#39;d&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;script&#39;</span><span class="p">,</span> <span class="s">&#39;</span><span class="se">\&#39;</span><span class="s">script&#39;</span><span class="p">,</span> <span class="s">&#39;fjs&#39;</span><span class="p">,</span> <span class="s">&#39;document&#39;</span>
</span><span class='line'><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<a name="What.s.happening."></a>
<h3>What&rsquo;s happening?</h3>

<p><strong>Text Processing</strong></p>

<ol>
<li><p>In our index route we use <code>beautifulsoup</code> to <a href="http://www.crummy.com/software/BeautifulSoup/bs4/doc/#get-text">clean</a> the text, by removing the HTML tags, that we get back from the URL as well as <code>nltk</code> to-</p>

<ul>
<li>Tokenize the raw text (break up the text into individual words), and</li>
<li>Turn the tokens into an nltk text object.</li>
</ul>
</li>
<li><p>In order for nltk to work right, you need to download the <a href="http://www.nltk.org/api/nltk.tokenize.html#module-nltk.tokenize.punkt">correct</a> tokenizers. First create a new directory &ndash; <code>mkdir nltk_data</code> &ndash; then run &ndash; <code>python -m nltk.downloader</code>.</p>

<p> When the installation window appears, update the &lsquo;Download Directory&rsquo; to <em>whatever_the_absolute_path_to_your_app_is/nltk_data/</em>.</p>

<p> Then click the &lsquo;Models&rsquo; tab and select &lsquo;punkt&rsquo; from under the &lsquo;Identifier&rsquo; column. Click &lsquo;Download&rsquo;. Check the official <a href="http://nltk.googlecode.com/svn/trunk/doc/howto/data.html">documentation</a> for more information if you need help.</p></li>
</ol>


<p><strong>Remove Punctuation, Count Raw Words</strong></p>

<ol>
<li>Since we don&rsquo;t want punctuation counted in the final results, we create a regular expression that matches anything not in the standard alphabet.</li>
<li>Then, using a list comprehension, we create a list of words without punctuation or numbers.</li>
<li>Finally, we count the number of times each word appears in the list using <a href="http://pymotw.com/2/collections/counter.html">Counter</a> &ndash; which is a really useful tool for tallying the number of times something appears in a list.</li>
</ol>


<p><strong>Stop Words</strong></p>

<p>Our current output contains a lot of words that we likely don&rsquo;t want to count &ndash; i.e., &ldquo;I&rdquo;, &ldquo;me&rdquo;, &ldquo;the&rdquo;, and so forth. These are called stop words.</p>

<ol>
<li>With the <code>stops</code> list, we again use a list comprehension to create a list of words that do not include those stop words.</li>
<li>Next, we create a dictionary with the words (as keys) and their associated counts (as values).</li>
<li>And finally we use the <code>sorted</code> tool to get a sorted representation of our dictionary. We then can use this to display the words with the highest count at the top of the list, which means that we won&rsquo;t have to do that sorting in our Jinja template.</li>
</ol>


<blockquote><p>For a more robust stop word list, use the NLTK <a href="http://www.nltk.org/book/ch02.html">stopwords corpus</a>.</p></blockquote>

<p><strong>Save the Results</strong></p>

<p>Finally we use a try/except to save the results of our search and counts to the database.</p>

<a name="Display.Results"></a>
<h2>Display Results</h2>

<p>Now let&rsquo;s update <em>index.html</em> in order to display the results:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>  <span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>Wordcount<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">name=</span><span class="s">&quot;viewport&quot;</span> <span class="na">content=</span><span class="s">&quot;width=device-width, initial-scale=1.0&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">&quot;http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css&quot;</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">media=</span><span class="s">&quot;screen&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;style&gt;</span>
</span><span class='line'>      <span class="nc">.container</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">max-width</span><span class="o">:</span> <span class="m">1000px</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="nt">&lt;/style&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;row&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;col-sm-5 col-sm-offset-1&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>          <span class="nt">&lt;h1&gt;</span>Wordcount 3000<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>          <span class="nt">&lt;br&gt;</span>
</span><span class='line'>          <span class="nt">&lt;form</span> <span class="na">role=</span><span class="s">&quot;form&quot;</span> <span class="na">method=</span><span class="s">&quot;POST&quot;</span> <span class="na">action=</span><span class="s">&quot;/&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;form-group&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>              <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">name=</span><span class="s">&quot;url&quot;</span> <span class="na">class=</span><span class="s">&quot;form-control&quot;</span> <span class="na">id=</span><span class="s">&quot;url-box&quot;</span> <span class="na">placeholder=</span><span class="s">&quot;Enter URL...&quot;</span> <span class="na">style=</span><span class="s">&quot;max-width: 300px;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>            <span class="nt">&lt;button</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">class=</span><span class="s">&quot;btn btn-default&quot;</span><span class="nt">&gt;</span>Submit<span class="nt">&lt;/button&gt;</span>
</span><span class='line'>          <span class="nt">&lt;/form&gt;</span>
</span><span class='line'>          <span class="nt">&lt;br&gt;</span>
</span><span class='line'>          {% for error in errors %}
</span><span class='line'>            <span class="nt">&lt;h4&gt;</span>{{ error }}<span class="nt">&lt;/h4&gt;</span>
</span><span class='line'>          {% endfor %}
</span><span class='line'>          <span class="nt">&lt;br&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;col-sm-5 col-sm-offset-1&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>          {% if results %}
</span><span class='line'>            <span class="nt">&lt;h2&gt;</span>Frequencies<span class="nt">&lt;/h2&gt;</span>
</span><span class='line'>            <span class="nt">&lt;br&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;results&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>              <span class="nt">&lt;table</span> <span class="na">class=</span><span class="s">&quot;table table-striped&quot;</span> <span class="na">style=</span><span class="s">&quot;max-width: 300px;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                <span class="nt">&lt;thead&gt;</span>
</span><span class='line'>                  <span class="nt">&lt;tr&gt;</span>
</span><span class='line'>                    <span class="nt">&lt;th&gt;</span>Word<span class="nt">&lt;/th&gt;</span>
</span><span class='line'>                    <span class="nt">&lt;th&gt;</span>Count<span class="nt">&lt;/th&gt;</span>
</span><span class='line'>                  <span class="nt">&lt;/tr&gt;</span>
</span><span class='line'>                <span class="nt">&lt;/thead&gt;</span>
</span><span class='line'>                {% for result in results%}
</span><span class='line'>                  <span class="nt">&lt;tr&gt;</span>
</span><span class='line'>                    <span class="nt">&lt;td&gt;</span>{{ result[0] }}<span class="nt">&lt;/td&gt;</span>
</span><span class='line'>                    <span class="nt">&lt;td&gt;</span>{{ result[1] }}<span class="nt">&lt;/td&gt;</span>
</span><span class='line'>                  <span class="nt">&lt;/tr&gt;</span>
</span><span class='line'>                {% endfor %}
</span><span class='line'>              <span class="nt">&lt;/table&gt;</span>
</span><span class='line'>            <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>          {% endif %}
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;br&gt;&lt;br&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;http://code.jquery.com/jquery-1.11.0.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here, we added an <code>if</code> statement to see if our <code>results</code> dictionary has anything in it and then added a <code>for</code> loop to iterate over the <code>results</code> and display them in a table. Run your app and you should be able to enter a URL and get back the count of the words on the page.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python manage.py runserver
</span></code></pre></td></tr></table></div></figure>


<p>What if we wanted to display the first ten keywords from the dictionary? We can simply limit the dictionary to the first 10 results:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">results</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span>
</span><span class='line'>    <span class="n">no_stop_words_count</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span>
</span><span class='line'>    <span class="n">key</span><span class="o">=</span><span class="n">operator</span><span class="o">.</span><span class="n">itemgetter</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span>
</span><span class='line'>    <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span>
</span><span class='line'><span class="p">)[:</span><span class="mi">10</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Test it out.</p>

<a name="Summary"></a>
<h2>Summary</h2>

<p>Okay great. Given a URL we can count the words that are on the page. If you use a site without a massive amount of words, like <a href="http://realpython.com">http://realpython.com</a> for instance, the processing should happen fairly quickly. What happens if the site has <em>a lot</em> of words, though? For example, try out <a href="http://gutenberg.ca/">http://gutenberg.ca</a>. You&rsquo;ll notice that this takes longer to process. If you have a number of users all hitting your site at once to get word counts, and some of them are trying to count larger pages, this can become a problem. Or perhaps you decide to change the functionality so that when a user inputs a URL, we recursively scrape the entire web site and calculate word frequencies based on each individual page. Again, with enough traffic, this will significantly slow down the site.</p>

<p>What&rsquo;s the solution? Instead of counting the words after each user makes a request, we need to use a queue to process this in the backend &ndash; which is exactly where will start next time. For now, commit your code and push it up to staging only since this new text processing feature is only half finished.</p>

<p>Before you push to Heroku, I recommend removing all language tokenizers except for English along with the zip file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>.
</span><span class='line'>└── tokenizers
</span><span class='line'>    └── punkt
</span><span class='line'>        ├── PY3
</span><span class='line'>        │   └── english.pickle
</span><span class='line'>        └── english.pickle
</span></code></pre></td></tr></table></div></figure>


<p>This will significantly reduce the size of the commit. Keep in mind though that if you do process a non-English site, it will only process English words.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>git push stage master
</span></code></pre></td></tr></table></div></figure>


<p>Check it out here &ndash; <a href="http://wordcounts-stage.herokuapp.com/">http://wordcounts-stage.herokuapp.com/</a></p>

<p><strong>Test it out on staging. Comment if you have questions. See you next time!</strong></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Setting up Sublime Text 3 for Full Stack Python Development]]></title>
    <link href="https://realpython.com/blog/python/setting-up-sublime-text-3-for-full-stack-python-development/"/>
    <updated>2014-08-11T06:24:04-07:00</updated>
    <id>https://realpython.com/blog/python/setting-up-sublime-text-3-for-full-stack-python-development</id>
    <content type="html"><![CDATA[<p><a href="http://www.sublimetext.com/3">Sublime Text 3</a> (ST3) is lightweight, cross-platform code editor known for its speed, ease of use, and strong community support. It&rsquo;s an incredible editor right out of the box, but the real power comes from the ability to enhance its functionality using Package Control and creating custom settings.</p>

<p><strong>In this article, we&rsquo;ll look at how to setup Sublime Text for full stack Python development (from the front to back), enhance the basic functionality with custom themes and packages, and use many of the commands, features, and keyword shortcuts that make ST3 so powerful.</strong></p>

<p><img src="https://raw.githubusercontent.com/mjhea0/sublime-setup-for-python/master/img/main_sublime_text_3_screen.png" alt="main_sublime_text_3_screen" /></p>

<blockquote><p>This tutorial assumes you&rsquo;re using a Mac and are comfortable with the terminal. If you&rsquo;re using Windows or Linux, many of the commands will vary, but you should be able to use Google to find the answers quickly given the info in this tutorial.</p></blockquote>

<p>Before we start, let&rsquo;s address what I mean exactly by &ldquo;full stack&rdquo;.</p>

<p>In today&rsquo;s world of HTML5 and mobile development, Javascript is literally everywhere. EVERYWHERE. Python coupled with a framework such as Django or Flask is not enough. To really develop a website from end-to-end, you must be familiar with Javascript (and the various Javascript frameworks), REST APIs, responsive design, and of course HTML and CSS, among others. <strong>And let&rsquo;s face it: Like any craftsman, in order to be the best programmer you can be, your tools must be sharp. Your development environment must be setup for full stack development &ndash; which is exactly what we are going to do right now&hellip;</strong></p>

<a name="Features"></a>
<h2>Features</h2>

<p>Let&rsquo;s start by looking at a few of the default features of Sublime Text 3&hellip;</p>

<ol>
<li><p><strong>Split Layouts</strong> allow you to arrange your files in various split-screens. This is useful for test driven development (Python code on one screen, test scripts on another) or when working on the front end (HTML on one screen, CSS and/or Javascript on another).</p>

<p> <img src="https://raw.githubusercontent.com/mjhea0/sublime-setup-for-python/master/img/st3_split_screen.png" alt="st3_split_screen" /></p></li>
<li><p><strong><a href="http://www.sublimetext.com/docs/3/vintage.html">Vintage Mode</a></strong> provides you with vi commands for use within ST3.</p></li>
<li><strong>Chrome-like Tabs</strong> make navigating and editing several files much simpler.</li>
<li><strong>Automatic loading of the last session</strong> re-opens all files and folders you had open when you closed the editor the last time. I leave ST3 open all the time, with various projects open &ndash; so if I reset the computer, it opens the files and folders right back up.</li>
<li><p><strong>Code Snippets</strong> increase your productivity by giving you the ability to create common pieces of code with a single keyword. There are a number of default snippets. For example, open a new file and type in &ldquo;lorem&rdquo; then press tab. You should get a paragraph of lorem ipsum text. Also, if you type &ldquo;defs&rdquo; then press tab in a Python file it will setup a generic function.</p>

<p> You can also create your own snippets: <strong>Tools > New Snippet</strong>. Refer to the <a href="http://sublimetext.info/docs/en/extensibility/snippets.html">documentation</a> for help, and also check out some of my snippets <a href="https://github.com/mjhea0/sublime-setup-for-python/tree/master/dotfiles/snippets">here</a>.</p></li>
</ol>


<a name="Customizing.Sublime.Text.3"></a>
<h2>Customizing Sublime Text 3</h2>

<p>After downloading ST3 &hellip;</p>

<a name="Install.the..code.subl..code..command.line.tool"></a>
<h3>Install the <code>subl</code> command line tool</h3>

<p>Like the <code>mate</code> command for TextMate, Sublime Text includes a command line tool called <strong><a href="http://www.sublimetext.com/docs/3/osx_command_line.html"><code>subl</code></a></strong> that allows you to open one file, or an entire directory of files and folders, from the terminal.</p>

<p><strong>To enable this command, create a symbolic link to the subl binary:</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>ln -s <span class="s2">&quot;/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl&quot;</span> ~/bin/subl
</span></code></pre></td></tr></table></div></figure>


<p><strong>Ensure that the link works by opening Sublime:</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>subl
</span></code></pre></td></tr></table></div></figure>


<p><strong>If that didn&rsquo;t work, you probably need to add <em>/bin</em> to your Path:</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span><span class="nb">echo</span> <span class="s2">&quot;export PATH=~/bin:$PATH&quot;</span> &gt;&gt; ~/.profile
</span></code></pre></td></tr></table></div></figure>


<p>Then repeat step one.</p>

<p><em>If you are still having trouble, check out <a href="http://stackoverflow.com/questions/16199581/opening-sublime-text-on-command-line-as-subl-on-mac-os?lq=1">this</a> article for help. Also, here are links for help on creating the symbolic links in <a href="http://stackoverflow.com/questions/9440639/sublime-text-from-command-line-win7?rq=1">Windows</a> and <a href="http://askubuntu.com/questions/273034/lauching-sublime-text-from-command-line">Linux</a>.</em></p>

<p><strong>Now you can open a file or directory using the following commands:</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="c"># open the current directory</span>
</span><span class='line'><span class="nv">$ </span>subl .
</span><span class='line'>
</span><span class='line'><span class="c"># open a directory called tests</span>
</span><span class='line'><span class="nv">$ </span>subl ~/Documents/test
</span><span class='line'>
</span><span class='line'><span class="c"># open a file called text.txt</span>
</span><span class='line'><span class="nv">$ </span>subl test.txt
</span></code></pre></td></tr></table></div></figure>


<p>If there are spaces in the path, you must surround the entire path in double quotes:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>subl <span class="s2">&quot;~/Documents/test/my test file.txt&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>To view all the commands, open up the help file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>subl --help
</span></code></pre></td></tr></table></div></figure>


<a name="Install.Package.Control"></a>
<h3>Install Package Control</h3>

<p>To begin taking advantage of the various <a href="https://sublime.wbond.net/">packages</a> for extending Sublime&rsquo;s functionality, you need to install the package manager called <strong>Package Control</strong> &ndash; which you must install manually. Once installed, you can use Package Control to install/remove/upgrade all other ST3 packages.</p>

<ol>
<li><p>To install, copy the Python code for Sublime Text 3 found <a href="https://sublime.wbond.net/installation#st3">here</a>. Click <strong>View > Show Console</strong> to open the ST3 console. Paste the code into the console. Press <strong>enter</strong>. Reboot ST3.</p></li>
<li><p>You can now install packages by using the keyboard shortcut <strong>cmd+shift+P</strong>. Start typing <strong>install</strong> until <em>Package Control: Install Package</em> appears. Press <strong>enter</strong> and search for available packages.</p></li>
<li><p>Some other relevant commands are:</p>

<ul>
<li><em>List Packages</em> shows all your installed packages</li>
<li><em>Remove Packages</em> removes a specific package</li>
<li><em>Upgrade Package</em> upgrades a specific package</li>
<li><em>Upgrade/Overwrite All Packages</em> upgrades all your installed packages</li>
</ul>


<p> <br></p>

<p> Check out the official <a href="https://sublime.wbond.net/docs/usage">documentation</a> to view more commands.</p>

<p> <img src="https://raw.githubusercontent.com/mjhea0/sublime-setup-for-python/master/img/st3_package_control.png" alt="st3_package_control" /></p></li>
</ol>


<a name="Create.a.Custom.Settings.File"></a>
<h3>Create a Custom Settings File</h3>

<p>You can fully configure Sublime Text using JSON-based settings files, making it easy to transfer, or synchronize, your customized settings to another system. First, we need to create our customized settings. It&rsquo;s best to create a base file for all environments as well as language-specific settings files.</p>

<p><strong>To set up a base file click <em>Sublime Text > Preferences > Settings &ndash; User</em>. Add an empty JSON object to the file and add your settings like so:</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='json'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="err">//</span> <span class="err">base</span> <span class="err">settings</span>
</span><span class='line'>  <span class="nt">&quot;auto_complete&quot;</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>  <span class="nt">&quot;sublimelinter&quot;</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>  <span class="nt">&quot;tab_size&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span><span class='line'>  <span class="nt">&quot;word_wrap&quot;</span><span class="p">:</span> <span class="kc">true</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<ol>
<li><p>For language specific settings click <strong>Sublime Text > Preferences > Settings &ndash; More > Syntax Specific &ndash; User</strong>. Then save the file using the following format: <em>LANGUAGE.sublime-settings</em>. So, for Python-specific settings, save the file as <em>Python.sublime-settings</em>.</p></li>
<li><p>You can obviously configure your settings to your liking; however, I highly recommend starting with my <a href="https://github.com/mjhea0/sublime-setup-for-python/blob/master/dotfiles/Preferences.sublime-settings">base</a> and <a href="https://github.com/mjhea0/sublime-setup-for-python/blob/master/dotfiles/Python.sublime-settings">Python-specific</a> settings &ndash; then making changes as you see fit.</p></li>
<li><p>Optional: You can use Dropbox to sync all your settings. Simply upload your settings files to <a href="https://github.com/miohtama/ztanesh/blob/master/zsh-scripts/bin/setup-sync-sublime-over-dropbox.sh">Dropbox</a> and load them from there to sync the Sublime environments on all your machines.</p></li>
<li><p>A good reference for settings can be found at the <a href="http://sublime-text-unofficial-documentation.readthedocs.org/en/latest/reference/settings.html">Sublime Text Unofficial Documentation</a>.</p></li>
</ol>


<a name="Themes"></a>
<h2>Themes</h2>

<p>ST3 also gives you the option to change the overall theme to better suit your personality. Design your own. Or, if you&rsquo;re not artistically inclined, you can download one of the various custom <a href="https://sublime.wbond.net/browse/labels/theme">themes</a> designed by the Sublime community through Package Control. Check out <a href="http://colorsublime.com/">ColorSublime</a> to preview themes before installing them.</p>

<p>The ever popular <a href="https://sublime.wbond.net/packages/Theme%20-%20Soda">Soda Dark Theme</a> and the minimal <a href="https://sublime.wbond.net/packages/Theme%20-%20Flatland">Flatland</a> are two of my personal favorites.</p>

<p>After installing a theme, make sure to update your base settings, <strong>Sublime Text > Preferences > Settings &ndash; User</strong>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='json'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="nt">&quot;theme&quot;</span><span class="p">:</span> <span class="s2">&quot;Flatland Dark.sublime-theme&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nt">&quot;color_scheme&quot;</span><span class="p">:</span> <span class="s2">&quot;Packages/Theme - Flatland/Flatland Dark.tmTheme&quot;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<a name="Packages"></a>
<h2>Packages</h2>

<p>Besides the packaged themes, I take advantage of the following packages to speed up my workflow.</p>

<a name="SideBarEnhancements"></a>
<h3>SideBarEnhancements</h3>

<p><strong><a href="https://sublime.wbond.net/packages/SideBarEnhancements">SideBarEnhancements</a></strong> extends the number of menu options in the sidebar, speeding up your overall workflow. Options such as &ldquo;New file&rdquo; and &ldquo;Duplicate&rdquo; are essential and should be part of ST3 out of the box. The &ldquo;Delete&rdquo; option alone makes it worth downloading. This feature simply sends files to the Trash, which may seem trivial but if you delete a file without it, it&rsquo;s very difficult to recover unless you&rsquo;re using a version control system.</p>

<p><img src="https://raw.githubusercontent.com/mjhea0/sublime-setup-for-python/master/img/st3_sidebar_enhancements.png" alt="st3_sidebar_enhancements" /></p>

<p>Download this now!</p>

<a name="Anaconda"></a>
<h3>Anaconda</h3>

<p><strong><a href="https://sublime.wbond.net/packages/Anaconda">Anaconda</a></strong> is the ultimate Python package; it adds a number of IDE-like features to ST3 including:</p>

<ul>
<li><strong>Autocompletion</strong> works by default, but there are a number of configuration <a href="https://github.com/DamnWidget/anaconda#anaconda-autocompletion">options</a>.</li>
<li><strong>Code <a href="http://en.wikipedia.org/wiki/Lint_%28software%29">linting</a></strong> uses either PyLint or PyFlakes with pep8. I personally use a different linting package, as I will explain shortly, so I disable linting altogether within the user-defined Anaconda settings file, <em>Anaconda.sublime-settings</em>,  via the file menu: <strong>Sublime > Preferences > Package Settings > Anaconda > Settings &ndash; User</strong>: <code>{"anaconda_linting": false}</code></li>
<li><strong>McCabe code complexity checker</strong> runs the <a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity">McCabe complexity checker</a> tool within a specific file. If you&rsquo;re unfamiliar with a complexity checker, be sure to visit the link above.</li>
<li><strong>Goto Definitions</strong> finds and displays the definition of any variable, function, or class throughout your entire project.</li>
<li><strong>Find Usage</strong> quickly searches where a variable, function, or class has been used in a specific file.</li>
<li><p><strong>Show Documentation</strong>: shows the Docstring for functions or classes (if defined, of course).</p>

<p><img src="https://raw.githubusercontent.com/mjhea0/sublime-setup-for-python/master/img/st3_anaconda_show_docs.png" alt="st3_anaconda_show_docs" /></p></li>
</ul>


<p>You can view all of the features <a href="https://github.com/DamnWidget/anaconda">here</a>, or within the README file in ST3&rsquo;s Package Settings: <strong>Sublime Text > Preferences > Package Settings > Anaconda > README</strong>.</p>

<blockquote><p><a href="https://sublime.wbond.net/packages/SublimeCodeIntel">SublimeCodeIntel</a> is another popular package, which has many of the same features as Anaconda. I suggest testing them both out.</p></blockquote>

<a name="Djaneiro"></a>
<h3>Djaneiro</h3>

<p><strong><a href="https://sublime.wbond.net/packages/Djaneiro">Djaneiro</a></strong> supports Django templating and keyword highlighting and provides useful code snippets (tab completions) for Sublime Text. The snippet system is an incredible timesaver. You can create common Django blocks with only a few keystrokes for templates, models, forms, and views. Check out the official <a href="https://github.com/squ1b3r/Djaneiro">documentation</a> to see a list of snippets.</p>

<p>My personal favorites are for templating: <code>var</code> creates  <code>{{ }}</code>  and <code>tag</code> creates  <code>{% %}</code></p>

<a name="requirementstxt"></a>
<h3>requirementstxt</h3>

<p><strong><a href="https://sublime.wbond.net/packages/requirementstxt">Requirementstxt</a></strong> provides autocompletion and syntax highlight-lighting as well as a nice version management system for your <em>requirements.txt</em> files.</p>

<a name="SublimeLinter"></a>
<h3>SublimeLinter</h3>

<p><strong><a href="https://sublime.wbond.net/packages/SublimeLinter">SublimeLinter</a></strong> is a framework for ST3 linters. The package itself does not include any actual linters; those must be installed separately via Package Control using the <strong>SublimeLinter-[linter_name]</strong> naming syntax. You can view official linters <a href="https://github.com/SublimeLinter">here</a>. There are also a number of third party linters, which can be viewed in Package Control. Check out the installation instructions <a href="http://sublimelinter.readthedocs.org/en/latest/installation.html">here</a>.</p>

<p>For Python linting, I recommend using <strong><a href="https://sublime.wbond.net/packages/SublimeLinter-pyflakes">SublimeLinter-pyflakes</a></strong> and <strong><a href="https://sublime.wbond.net/packages/SublimeLinter-pep8">SublimeLinter-pep8</a></strong>.</p>

<p>I also use <strong><a href="https://sublime.wbond.net/packages/SublimeLinter-jshint">SublimeLinter-jshint</a></strong>, <strong><a href="https://sublime.wbond.net/packages/SublimeLinter-pyyaml">SublimeLinter-pyyaml</a></strong>, <strong><a href="https://sublime.wbond.net/packages/SublimeLinter-csslint">SublimeLinter-csslint</a></strong>, <strong><a href="https://sublime.wbond.net/packages/SublimeLinter-html-tidy">SublimeLinter-html-tidy</a></strong>, and <strong><a href="https://sublime.wbond.net/packages/SublimeLinter-json">SublimeLinter-json</a></strong>.</p>

<blockquote><p>Most of these linters have dependencies associated with them, so please read the installation instructions before installing.</p></blockquote>

<p>You can customize each linter in the user-defined <em>SublimeLinter.sublime-settings</em> file: <strong>Sublime Text > Preferences > Package Settings > SublimeLinter > Settings &ndash; User</strong>. For example, I ignore the following pep8 errors and warnings:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='json'><span class='line'><span class="s2">&quot;pep8&quot;</span><span class="err">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nt">&quot;@disable&quot;</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>    <span class="nt">&quot;args&quot;</span><span class="p">:</span> <span class="p">[],</span>
</span><span class='line'>    <span class="nt">&quot;excludes&quot;</span><span class="p">:</span> <span class="p">[],</span>
</span><span class='line'>    <span class="nt">&quot;ignore&quot;</span><span class="p">:</span> <span class="s2">&quot;E501,C0301,W0142,W0402,R0201,E1101,E1102,C0103,R0901,R0903,R0904,C1001,W0223,W0232,W0201,E1103,R0801,C0111&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="nt">&quot;max-line-length&quot;</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
</span><span class='line'>    <span class="nt">&quot;select&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span>
</span><span class='line'><span class="p">}</span><span class="err">,</span>
</span></code></pre></td></tr></table></div></figure>


<a name="GitGutter"></a>
<h3>GitGutter</h3>

<p><strong><a href="https://sublime.wbond.net/packages/GitGutter">GitGutter</a></strong> shows little icons in ST3&rsquo;s gutter area that indicate whether a line has been inserted, modified, or deleted since the last commit.</p>

<p><img src="https://raw.githubusercontent.com/mjhea0/sublime-setup-for-python/master/img/st3_gitgutter.png" alt="st3_gitgutter" /></p>

<blockquote><p>If you want support for a number of distributed version control systems (Git, SVN, Bazaar and Mercurial), check out <a href="https://sublime.wbond.net/packages/Modific">Modific</a></p></blockquote>

<a name="FTPSync"></a>
<h3>FTPSync</h3>

<p><strong><a href="https://sublime.wbond.net/packages/FTPSync">FTPSync</a></strong> syncs your project with your remote files. Simply <em>open</em> the file to download it (if the remote file is newer than your local file) and upload it to your remote server with every <em>save</em>. Great way to keep your local and remote(s) in sync. You&rsquo;ll want to make sure to add at least one remote connection by clicking <strong>Sublime Text > Preferences > Package Settings > FTPSync > Setup FTPSync</strong>.</p>

<p>Sample settings:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='json'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="err">&#39;primary&#39;:</span> <span class="err">{</span>
</span><span class='line'>    <span class="err">host:</span> <span class="err">&#39;ftp.mywebsite.com&#39;,</span>
</span><span class='line'>    <span class="err">username:</span> <span class="err">&#39;johnsmith&#39;,</span>
</span><span class='line'>    <span class="err">password:</span> <span class="err">&#39;secretpassword&#39;,</span>
</span><span class='line'>    <span class="err">path:</span> <span class="err">&#39;/www/&#39;,</span>
</span><span class='line'>
</span><span class='line'>    <span class="err">upload_on_save:</span> <span class="err">true,</span>
</span><span class='line'>    <span class="err">tls:</span> <span class="err">true</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="err">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I personally set the password to <code>null</code> because I don&rsquo;t want it visible in that file. FTPSync just asks for my password after each save.</p>

<a name="AdvancedNewFile"></a>
<h3>AdvancedNewFile</h3>

<p><strong><a href="https://sublime.wbond.net/packages/AdvancedNewFile">AdvancedNewFile</a></strong> is used to create a new folder or file from within ST3 with key bindings alone:</p>

<p><em>Simply bring up the AdvancedNewFile input through the appropriate key binding. Then, enter the path, along with the file name into the input field. Upon pressing enter, the file will be created. In addition, if the directories specified do not yet exist, they will also be created. By default, the path to the file being created will be filled shown in the status bar as you enter the path information.</em></p>

<p>For a more detailed explanation on its usage, check out the documentation on <a href="https://github.com/skuroda/Sublime-AdvancedNewFile#usage">Github</a>. Be sure to read about Tab Completion as well as Predefined Aliases.</p>

<p>I replaced the normal &ldquo;cmd+n&rdquo; command to create a new file with AdvancedNewFile by adding the following code to the <em>Key Bindings &ndash; User</em> file: <strong>Sublime Text > Preferences > Package Settings > AdvancedNewFile > Key Bindings &ndash; User</strong>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='json'><span class='line'><span class="p">[</span>
</span><span class='line'>  <span class="p">{</span> <span class="nt">&quot;keys&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;cmd+n&quot;</span><span class="p">],</span> <span class="nt">&quot;command&quot;</span><span class="p">:</span> <span class="s2">&quot;advanced_new_file_new&quot;</span><span class="p">}</span>
</span><span class='line'><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can also setup a default directory to start with: <strong>Sublime Text > Preferences > Package Settings > AdvancedNewFile > Settings &ndash; User</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='json'><span class='line'><span class="p">{</span><span class="nt">&quot;default_initial&quot;</span><span class="p">:</span> <span class="s2">&quot;/Users/michaelherman/Documents/repos&quot;</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now when I create a new file, the <code>/Users/michaelherman/Documents/repos</code> string is automatically inserted first, since 99% of the time I store all my scripts in that directory.</p>

<a name="Emmet"></a>
<h3>Emmet</h3>

<p><strong><a href="https://sublime.wbond.net/packages/Emmet">Emmet</a></strong>, previously known as Zen Coding, uses simple abbreviations to generate HTML or CSS code snippets.</p>

<p>For example, if you type a bang, <code>!</code>, then press tab in an HTML file ,the HTML5 doctype and a few basic tags are generated:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!doctype html&gt;</span>
</span><span class='line'><span class="nt">&lt;html</span> <span class="na">lang=</span><span class="s">&quot;en&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">&quot;UTF-8&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;title&gt;</span>Document<span class="nt">&lt;/title&gt;</span>
</span><span class='line'><span class="nt">&lt;/head&gt;</span>
</span><span class='line'><span class="nt">&lt;body&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Check out the official <a href="http://docs.emmet.io/">documentation</a> as well as this handy <a href="http://docs.emmet.io/cheat-sheet/">cheat sheet</a> for more info.</p>

<a name="Markdown.Preview"></a>
<h3>Markdown Preview</h3>

<p><strong><a href="https://sublime.wbond.net/packages/Markdown%20Preview">Markdown Preview</a></strong> is used for previewing and building markdown files.</p>

<p>To use, open the Package Manager then type <strong>Markdown Preview</strong> to show the available commands:</p>

<ul>
<li>Markdown Preview: Python Markdown: Preview in Browser</li>
<li>Markdown Preview: Python Markdown: Export HTML in Sublime Text</li>
<li>Markdown Preview: Python Markdown: Copy to Clipboard</li>
<li>Markdown Preview: Github Flavored Markdown: Preview in Browser</li>
<li>Markdown Preview: Github Flavored Markdown: Export HTML in Sublime Text</li>
<li>Markdown Preview: Github Flavored Markdown: Copy to Clipboard</li>
<li>Markdown Preview: Open Markdown Cheat sheet</li>
</ul>


<p>Once converted, the output file is updated on each subsequent save.</p>

<a name="Keyboard.Shortcuts"></a>
<h2>Keyboard Shortcuts</h2>

<ol>
<li><strong>Goto Anything (&ldquo;cmd+p&rdquo;)</strong> is used for quickly finding and opening files. Just type in a part of a path and filename within a project and you can easily open that file. This is great for quickly opening files in large Django projects.</li>
<li><strong>Goto Line Number (&ldquo;ctrl+g&rdquo;)</strong> takes you to a specific line number in an active file.</li>
<li><strong>Goto Symbol (&ldquo;cmd+r&rdquo;)</strong> lists all functions and classes within a file to make them easier to find. Simply start typing the one you want.</li>
<li><strong>Go to beginning of line (cmd+left-arrow-key</strong>) and <strong>Go to end of line (cmd+right-arrow-key</strong>)</li>
<li><strong>Delete current line (ctrl+shift+k)</strong></li>
<li><strong>Multi-Edit</strong> is by far my favorite shortcut

<ol>
<li>Select a word, press <strong>&ldquo;cmd+d&rdquo;</strong> to select the next same word, then press <strong>&ldquo;cmd+d&rdquo;</strong> again to select the next same word&hellip;</li>
<li>Press <strong>&ldquo;cmd+click&rdquo;</strong> to create a cursor for editing every where you click</li>
</ol>
</li>
<li><strong>Block select (&ldquo;option+left-mouse-click)</strong> is used to select a block of text. Perfect for removing blank space when formatting a CSV file.</li>
</ol>


<blockquote><p>For more shortcuts, take a look at <a href="http://sublime-text-unofficial-documentation.readthedocs.org/en/latest/reference/keyboard_shortcuts_osx.html">this</a> article.</p></blockquote>

<a name="Custom.Commands"></a>
<h2>Custom Commands</h2>

<p>It&rsquo;s easy to write your own custom commands and key bindings with Python. I currently use &hellip;</p>

<ol>
<li>Copy the path of the current file to the clipboard &ndash; <a href="https://github.com/mjhea0/sublime-setup-for-python/blob/master/dotfiles/copy_path_to_clipboard.py">link</a></li>
<li>Close all tabs except the active one &ndash; <a href="https://github.com/mjhea0/sublime-setup-for-python/blob/master/dotfiles/close_tabs.py">link</a></li>
</ol>


<p>Install these by adding the Python files to your &ldquo;/Sublime Text 3/Packages/User&rdquo; directory via the file menu (<strong>Sublime > Preferences > Browse Packages</strong>), then opening the User directory. To complete the setup, bind them from the <em>Key Bindings &ndash; User</em> file (<strong>Sublime Text > Preferences > Package Settings > AdvancedNewFile > Key Bindings &ndash; User</strong>).</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='json'><span class='line'><span class="p">[</span>
</span><span class='line'>  <span class="err">//</span> <span class="err">Copy</span> <span class="err">file</span> <span class="err">name</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="nt">&quot;keys&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;cmd+shift+c&quot;</span><span class="p">],</span>
</span><span class='line'>    <span class="nt">&quot;command&quot;</span><span class="p">:</span> <span class="s2">&quot;copy_path_to_clipboard&quot;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="err">//</span> <span class="err">Close</span> <span class="err">all</span> <span class="err">other</span> <span class="err">tabs</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="nt">&quot;keys&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;cmd+alt+w&quot;</span><span class="p">],</span>
</span><span class='line'>    <span class="nt">&quot;command&quot;</span><span class="p">:</span> <span class="s2">&quot;close_tabs&quot;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<a name="Additional.Resources"></a>
<h2>Additional Resources</h2>

<ol>
<li><a href="http://docs.sublimetext.info/en/latest/index.html">Community-maintained documentation</a></li>
<li><a href="https://sublime.wbond.net/docs">Package Manager documentation</a></li>
<li><a href="http://sublime-text-unofficial-documentation.readthedocs.org/en/latest/reference/reference.html">Unofficial documentation reference</a></li>
<li><a href="http://slides.com/nicklang/pimp-my-editor">Pimp my Editor &ndash; Presentation</a></li>
</ol>


<a name="Conclusion"></a>
<h2>Conclusion</h2>

<p>I hope this article was helpful to you and that you were able to integrate some of the above packages and custom settings along with your own based on your personal preferences to improve your workflow. <strong>If you have any comments or suggestions of your own, please let me know in the comments below.</strong> Finally, check out the dotfiles folder in this <a href="https://github.com/mjhea0/sublime-setup-for-python/tree/master/dotfiles">repo</a> to view all resources that I created.</p>

<p>Cheers!</p>

<br>




<p style="font-size: 14px;">
  <em>Edits made by <a href="https://twitter.com/diek007">Derrick Kearney</a>. Thank you!</em>
</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Inner functions - what are they good for?]]></title>
    <link href="https://realpython.com/blog/python/inner-functions-what-are-they-good-for/"/>
    <updated>2014-08-04T04:57:51-07:00</updated>
    <id>https://realpython.com/blog/python/inner-functions-what-are-they-good-for</id>
    <content type="html"><![CDATA[<p>Let&rsquo;s look at three common reasons for writing inner functions.</p>

<p><strong>Remember</strong>: In Python, a function is a &ldquo;first-class&rdquo; <a href="https://realpython.com/blog/python/primer-on-python-decorators/#first-things-first">citizen</a>, meaning they are on par with any other object (i.e., integers, strings, lists, modules, etc.). You can dynamically create or destroy them, pass them to other functions, return them as values, and so forth.</p>

<blockquote><p>This tutorial utilizes Python version 3.4.1.</p></blockquote>

<a name="L1..Encapsulation"></a>
<h2>1. Encapsulation</h2>

<p>You use inner functions to <a href="http://en.wikipedia.org/wiki/Information_hiding">protect</a> them from <em>anything</em> happening outside of the function, meaning that they are hidden from the global scope.</p>

<p>Here&rsquo;s a simple example that highlights that concept:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">outer</span><span class="p">(</span><span class="n">num1</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">inner_increment</span><span class="p">(</span><span class="n">num1</span><span class="p">):</span>  <span class="c"># hidden from outer code</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">num1</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'>    <span class="n">num2</span> <span class="o">=</span> <span class="n">inner_increment</span><span class="p">(</span><span class="n">num1</span><span class="p">)</span>
</span><span class='line'>    <span class="k">print</span><span class="p">(</span><span class="n">num1</span><span class="p">,</span> <span class="n">num2</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">inner_increment</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
</span><span class='line'><span class="c"># outer(10)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Try calling the <code>inner_increment()</code> function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
</span><span class='line'>  <span class="n">File</span> <span class="s">&quot;inner.py&quot;</span><span class="p">,</span> <span class="n">line</span> <span class="mi">7</span><span class="p">,</span> <span class="ow">in</span> <span class="o">&lt;</span><span class="n">module</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="n">inner_increment</span><span class="p">()</span>
</span><span class='line'><span class="ne">NameError</span><span class="p">:</span> <span class="n">name</span> <span class="s">&#39;inner_increment&#39;</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">defined</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now comment out the <code>inner_increment</code> call and uncomment the outer function call, <code>outer(10)</code>, passing in <code>10</code> as the argument:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="mi">10</span> <span class="mi">11</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>Keep in mind that this is just an example. Although this code does achieve the desired result, it&rsquo;s probably better to make the <code>inner_increment()</code> function a top-level &ldquo;private&rdquo; function using a leading underscore: <code>_inner_increment()</code>.</p></blockquote>

<p>The following recursive example is a slightly better use case for a nested function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">factorial</span><span class="p">(</span><span class="n">number</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># error handling</span>
</span><span class='line'>    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">number</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
</span><span class='line'>        <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">&quot;Sorry. &#39;number&#39; must be an integer.&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="ow">not</span> <span class="n">number</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
</span><span class='line'>        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&quot;Sorry. &#39;number&#39; must be zero or positive.&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">inner_factorial</span><span class="p">(</span><span class="n">number</span><span class="p">):</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">number</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
</span><span class='line'>            <span class="k">return</span> <span class="mi">1</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">number</span><span class="o">*</span><span class="n">inner_factorial</span><span class="p">(</span><span class="n">number</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">inner_factorial</span><span class="p">(</span><span class="n">number</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># call the outer function</span>
</span><span class='line'><span class="k">print</span><span class="p">(</span><span class="n">factorial</span><span class="p">(</span><span class="mi">4</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Test this out as well. One main advantage of using this design pattern is that by performing all argument checking in the outer function, you can safely skip error checking altogether in the inner function.</p>

<blockquote><p>For a more detailed discussion of recursion see, <a href="http://interactivepython.org/courselib/static/pythonds/Recursion/recursionsimple.html">Problem Solving with Algorithms and Data Structures</a>.</p></blockquote>

<a name="L2..Keepin..it.DRY"></a>
<h2>2. Keepin&#8217; it <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">DRY</a></h2>

<p>Perhaps you have a giant function that performs the same chunk of code in numerous places. For example, you might write a function which processes a file, and you want to accept either an open file object or a file name:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="n">file_name</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">do_stuff</span><span class="p">(</span><span class="n">file_process</span><span class="p">):</span>
</span><span class='line'>        <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">file_process</span><span class="p">:</span>
</span><span class='line'>            <span class="k">print</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span><span class='line'>        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span class='line'>            <span class="n">do_stuff</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span><span class='line'>    <span class="k">else</span><span class="p">:</span>
</span><span class='line'>        <span class="n">do_stuff</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote><p>Again, it is common to just make <code>do_stuff()</code> a private top-level function, but if you want to hide it away as an internal function, you can.</p></blockquote>

<p>How about a practical example?</p>

<p>Let&rsquo;s say you want to know the number of WiFi hot spots in New York City. And yes the city has the raw data to tell us: <a href="https://data.cityofnewyork.us/Recreation/Wifi-Hotspot-Locations/ehc4-fktp">datasource</a>. Visit the site and download the CSV.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="n">file_name</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">do_stuff</span><span class="p">(</span><span class="n">file_process</span><span class="p">):</span>
</span><span class='line'>        <span class="n">wifi_locations</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">file_process</span><span class="p">:</span>
</span><span class='line'>            <span class="n">values</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;,&#39;</span><span class="p">)</span>
</span><span class='line'>            <span class="c"># Build the dict, and increment values</span>
</span><span class='line'>            <span class="n">wifi_locations</span><span class="p">[</span><span class="n">values</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span> <span class="o">=</span> <span class="n">wifi_locations</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">values</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">max_key</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>        <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">wifi_locations</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span class='line'>            <span class="n">all_locations</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">wifi_locations</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
</span><span class='line'>            <span class="k">if</span> <span class="n">key</span> <span class="o">&gt;</span> <span class="n">max_key</span><span class="p">:</span>
</span><span class='line'>                <span class="n">max_key</span> <span class="o">=</span> <span class="n">key</span>
</span><span class='line'>                <span class="n">business</span> <span class="o">=</span> <span class="n">name</span>
</span><span class='line'>        <span class="k">print</span><span class="p">(</span><span class="s">&#39;There are {0} WiFi hot spots in NYC and {1} has the most with {2}.&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
</span><span class='line'>            <span class="n">all_locations</span><span class="p">,</span> <span class="n">business</span><span class="p">,</span> <span class="n">max_key</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span><span class='line'>        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span class='line'>            <span class="n">do_stuff</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span><span class='line'>    <span class="k">else</span><span class="p">:</span>
</span><span class='line'>        <span class="n">do_stuff</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">process</span><span class="p">(</span><span class="s">&quot;NAME_OF_THE.csv&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Run the function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">There</span> <span class="n">are</span> <span class="mi">1251</span> <span class="n">WiFi</span> <span class="n">hot</span> <span class="n">spots</span> <span class="ow">in</span> <span class="n">NYC</span> <span class="ow">and</span> <span class="n">Starbucks</span> <span class="n">has</span> <span class="n">the</span> <span class="n">most</span> <span class="k">with</span> <span class="mf">212.</span>
</span></code></pre></td></tr></table></div></figure>


<a name="L3..Closures.and.Factory.Functions"></a>
<h2>3. Closures and Factory Functions</h2>

<p>Now we come to the most important reason to use inner functions. All of the inner function examples we&rsquo;ve seen so far have been ordinary functions that merely happened to be nested inside another function. In other words, we could have defined these functions in another way (as discussed); there is no specific reason for why they <em>should</em> be nested.</p>

<p>But when it comes to closure, that is not the case: You must utilize nested functions.</p>

<a name="What.s.a.closure."></a>
<h3>What&rsquo;s a closure?</h3>

<p>A closure simply causes the inner function to <em>remember</em> the state of its environment when called. Beginners often think that a closure <em>is</em> the inner function, when it&rsquo;s really <em>caused</em> by the inner function. The closure &ldquo;closes&rdquo; the local variable on the stack and this stays around after the the stack creation has finished executing.</p>

<a name="An.example"></a>
<h3>An example</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">generate_power</span><span class="p">(</span><span class="n">number</span><span class="p">):</span>
</span><span class='line'>    <span class="sd">&quot;&quot;&quot;</span>
</span><span class='line'><span class="sd">    Examples of use:</span>
</span><span class='line'>
</span><span class='line'><span class="sd">    &gt;&gt;&gt; raise_two = generate_power(2)</span>
</span><span class='line'><span class="sd">    &gt;&gt;&gt; raise_three = generate_power(3)</span>
</span><span class='line'><span class="sd">    &gt;&gt;&gt; print(raise_two(7))</span>
</span><span class='line'><span class="sd">    128</span>
</span><span class='line'><span class="sd">    &gt;&gt;&gt; print(raise_three(5))</span>
</span><span class='line'><span class="sd">    243</span>
</span><span class='line'><span class="sd">    &quot;&quot;&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># define the inner function ...</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">nth_power</span><span class="p">(</span><span class="n">power</span><span class="p">):</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">number</span> <span class="o">**</span> <span class="n">power</span>
</span><span class='line'>    <span class="c"># ... which is returned by the factory function</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">nth_power</span>
</span></code></pre></td></tr></table></div></figure>


<a name="What.s.happening.here."></a>
<h3>What&rsquo;s happening here?</h3>

<ol>
<li>The &lsquo;generate_power()&rsquo; function is a <em>factory function</em> &ndash; which simply means that it creates a new function each time it is called and then returns the newly created function. Thus, <code>raise_two</code> and <code>raise_three</code> are the newly created functions.</li>
<li>What does this new, inner function do? It takes a single argument, <code>power</code>, and returns <code>number**power</code>.</li>
<li><p>Where does the inner function get the value of <code>number</code> from? This is where the closure comes into play: <code>nth_power()</code> gets the value of <code>power</code> from the outer function, the <em>factory function</em>. Let&rsquo;s step through this process:</p>

<ul>
<li>Call the outer function: <code>generate_power(2)</code></li>
<li>Build the <code>nth_power()</code> function which takes a single argument <code>power</code></li>
<li>Take a snapshot of the state of <code>nth_power()</code> which includes <code>power=2</code></li>
<li>Pass that snapshot into the <code>generate_power()</code> function</li>
<li>Return the <code>nth_power()</code> function</li>
</ul>


<p> Put another way, the closure functions to &ldquo;initialize&rdquo; the number bar in the <code>nth_power()</code> function and then returns it. Now, whenever you call that newly returned function, it will always see its own private snapshot that includes <code>power=2</code>.</p></li>
</ol>


<a name="Real.World"></a>
<h3>Real World</h3>

<p>How about a real world example?</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">has_permission</span><span class="p">(</span><span class="n">page</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">inner</span><span class="p">(</span><span class="n">username</span><span class="p">):</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">username</span> <span class="o">==</span> <span class="s">&#39;Admin&#39;</span><span class="p">:</span>
</span><span class='line'>            <span class="k">return</span> <span class="s">&quot;&#39;{0}&#39; does have access to {1}.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">page</span><span class="p">)</span>
</span><span class='line'>        <span class="k">else</span><span class="p">:</span>
</span><span class='line'>            <span class="k">return</span> <span class="s">&quot;&#39;{0}&#39; does NOT have access to {1}.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">page</span><span class="p">)</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">inner</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">current_user</span> <span class="o">=</span> <span class="n">has_permission</span><span class="p">(</span><span class="s">&#39;Admin Area&#39;</span><span class="p">)</span>
</span><span class='line'><span class="k">print</span><span class="p">(</span><span class="n">current_user</span><span class="p">(</span><span class="s">&#39;Admin&#39;</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="n">random_user</span> <span class="o">=</span> <span class="n">has_permission</span><span class="p">(</span><span class="s">&#39;Admin Area&#39;</span><span class="p">)</span>
</span><span class='line'><span class="k">print</span><span class="p">(</span><span class="n">current_user</span><span class="p">(</span><span class="s">&#39;Not Admin&#39;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is a simplified function to check if a certain user has the correct permissions to access a certain page. You could easily modify this to grab the user in session to check if they have the correct credentials to access a certain route. Instead of checking if the user is just equal to &lsquo;Admin&rsquo;, you could query the database to check the permission then return the correct view depending on whether the credentials are correct or not.</p>

<a name="Conclusion"></a>
<h2>Conclusion</h2>

<p>The use of closures and factory functions is the most common, and powerful, use for inner functions. In most cases, when you see a decorated function, the decorator is a factory function which takes a function as argument, and returns a new function which includes the old function inside the closure. Stop. Take a deep breath. Grab a coffee. Read that again.</p>

<p>Put another way, a decorator is just syntactic sugar for implementing the process outlined in the <code>generate_power()</code> example.</p>

<p>I&rsquo;ll leave you with an example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">generate_power</span><span class="p">(</span><span class="n">exponent</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span class='line'>        <span class="k">def</span> <span class="nf">inner</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span>
</span><span class='line'>            <span class="n">result</span> <span class="o">=</span> <span class="n">f</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">exponent</span><span class="o">**</span><span class="n">result</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">inner</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">decorator</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nd">@generate_power</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">raise_two</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">n</span>
</span><span class='line'>
</span><span class='line'><span class="k">print</span><span class="p">(</span><span class="n">raise_two</span><span class="p">(</span><span class="mi">7</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nd">@generate_power</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">raise_three</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">n</span>
</span><span class='line'>
</span><span class='line'><span class="k">print</span><span class="p">(</span><span class="n">raise_two</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>If your code editor allows it, view the <code>generate_power(exponent)</code> and <code>generate_power(number)</code> functions side-by-side to illustrate the concepts discussed. (Sublime Text has Column View, for example).</p>

<p>If you have not coded the two functions, open the code editor and start coding. For new programmers, coding is a hands on activity, like riding a bike you just have to do it &ndash; and do it solo. So back to the task at hand. After you typed the code, you can now clearly see that the code is similar in that it produces the same results but there are differences. For those who have never used decorators, noting these differences will be the first step in understanding them if you venture down that path.</p>

<hr>


<p><strong>If you&rsquo;d like to know more about this syntax and decorators in general, check out our <a href="https://realpython.com/blog/python/primer-on-python-decorators/">Primer on Python Decorators</a>. Comment below with questions.</strong></p>

<br>




<p style="font-size: 14px;">
  <em>Edits made by <a href="https://twitter.com/diek007">Derrick Kearney</a>. Thank you!</em>
</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Data Migrations]]></title>
    <link href="https://realpython.com/blog/python/data-migrations/"/>
    <updated>2014-07-25T07:24:04-07:00</updated>
    <id>https://realpython.com/blog/python/data-migrations</id>
    <content type="html"><![CDATA[<div class="center-text">
  <img class="no-border" src="https://realpython.com/images/blog_images/django-migrations.png" style="max-width: 500px;">
</div>


<p>This is the final article in our Django migrations series:</p>

<ul>
<li>Part 1: <a href="https://realpython.com/blog/python/django-migrations-a-primer/">Django Migrations &ndash; A Primer</a></li>
<li>Part 2: <a href="https://realpython.com/blog/python/digging-deeper-into-migrations/">Digging Deeper into Migrations</a></li>
<li><strong>Part 3: Data Migrations (current article)</strong></li>
<li>Video: <a href="https://realpython.com/blog/python/django-migrations-a-primer/#video">Django 1.7 Migrations &ndash; primer</a></li>
</ul>


<p>Back again.</p>

<p>Migrations are mainly for keeping the data model of you database up-to-date, but a database is more than just a data model. Most notably, it&rsquo;s also a large collection of data. So any discussion of database migrations wouldn&rsquo;t be complete without also talking about data migrations.</p>

<a name="Data.Migrations.Defined"></a>
<h2>Data Migrations Defined</h2>

<p>Data migrations are used in a number of scenarios. Two very popular ones are:</p>

<ol>
<li>When you would like to load &ldquo;system data&rdquo; that your application depends upon being present to operate successfully.</li>
<li>When a change to a data model forces the need to change the existing data.</li>
</ol>


<blockquote><p>Do note that loading dummy data for testing is not in the above list. You could use migrations to do that, but migrations are often run on production servers, so you probably don&rsquo;t want to be creating a bunch of dummy test data on your production server.</p></blockquote>

<a name="Examples"></a>
<h2>Examples</h2>

<p>Continuing from the previous Django Project, as an example of creating some &ldquo;system data&rdquo;, let&rsquo;s create some historical bitcoin prices. Django migrations will help us out, by creating an empty migration file and putting it in the right place if we type:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ ./manage.py makemigrations --empty historical_data</span></code></pre></td></tr></table></div></figure>


<p>This should create a file called <code>historical_data/migrations/003_auto&lt;date_time_stamp&gt;.py</code>. Let&rsquo;s change the name to <code>003_load_historical_data.py</code> and then open it up. You&rsquo;ll have a default structure which looks like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># encoding: utf8</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">models</span><span class="p">,</span> <span class="n">migrations</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Migration</span><span class="p">(</span><span class="n">migrations</span><span class="o">.</span><span class="n">Migration</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">dependencies</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>        <span class="p">(</span><span class="s">&#39;historical_data&#39;</span><span class="p">,</span> <span class="s">&#39;0002_auto_20140710_0810&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">operations</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>    <span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can see it&rsquo;s created a base structure for us, and even inserted the dependencies. That&rsquo;s helpful. Now to do some data migrations, use the <code>RunPython</code> migration operation:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># encoding: utf8</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">models</span><span class="p">,</span> <span class="n">migrations</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">historical_data.models</span> <span class="kn">import</span> <span class="n">PriceHistory</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">date</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">load_data</span><span class="p">(</span><span class="n">apps</span><span class="p">,</span> <span class="n">schema_editor</span><span class="p">):</span>
</span><span class='line'>    <span class="n">PriceHistory</span><span class="p">(</span><span class="n">date</span><span class="o">=</span><span class="n">date</span><span class="p">(</span><span class="mi">2013</span><span class="p">,</span><span class="mi">11</span><span class="p">,</span><span class="mi">29</span><span class="p">),</span>
</span><span class='line'>         <span class="n">price</span><span class="o">=</span><span class="mf">1234.00</span><span class="p">,</span>
</span><span class='line'>         <span class="n">volume</span><span class="o">=</span><span class="mi">354564</span><span class="p">,</span>
</span><span class='line'>         <span class="n">total_btc</span><span class="o">=</span><span class="mi">12054375</span><span class="p">,</span>
</span><span class='line'>         <span class="p">)</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
</span><span class='line'>    <span class="n">PriceHistory</span><span class="p">(</span><span class="n">date</span><span class="o">=</span><span class="n">date</span><span class="p">(</span><span class="mi">2012</span><span class="p">,</span><span class="mi">11</span><span class="p">,</span><span class="mi">29</span><span class="p">),</span>
</span><span class='line'>         <span class="n">price</span><span class="o">=</span><span class="mf">12.15</span><span class="p">,</span>
</span><span class='line'>         <span class="n">volume</span><span class="o">=</span><span class="mi">187947</span><span class="p">,</span>
</span><span class='line'>         <span class="n">total_btc</span><span class="o">=</span><span class="mi">10504650</span><span class="p">,</span>
</span><span class='line'>         <span class="p">)</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Migration</span><span class="p">(</span><span class="n">migrations</span><span class="o">.</span><span class="n">Migration</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">dependencies</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>        <span class="p">(</span><span class="s">&#39;historical_data&#39;</span><span class="p">,</span> <span class="s">&#39;0002_auto_20140710_0810&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">operations</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>        <span class="n">migrations</span><span class="o">.</span><span class="n">RunPython</span><span class="p">(</span><span class="n">load_data</span><span class="p">)</span>
</span><span class='line'>    <span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>We start off by defining the function <code>load_data</code> which &ndash; you guessed it &ndash; loads data.</p>

<blockquote><p>For a real app we might want to go out to blockchain.info and grab the complete list of historic prices, but we just put a couple in there to show how the migration works.</p></blockquote>

<p>Once we have the function we can call it from our <code>RunPython</code> operation and then this function will be executed when we run <code>./manage.py migrate</code> from the command line.</p>

<p>This is arguably more work than running <code>syncdb</code> and having it load a fixture. In fact, migrations don&rsquo;t respect fixtures &ndash; meaning they won&rsquo;t automatically load them for you like <code>syncdb</code> would.</p>

<p>This is mainly due to philosophy.</p>

<p>While you could use migrations to load data, they are mainly about migrating data and/or data models. We&rsquo;ve shown an example of loading system data, mainly because it&rsquo;s a simple explanation of how you would set up a data migration, but often times, data migrations are used for more complex actions like transforming your data to match the new data model.</p>

<p>An example might be if we decided to start storing prices from multiple exchanges instead of just one, so we could add fields like <code>price_gox</code>, <code>price_btc</code>, etc, then we could use a migration to move all data from the <code>price</code> column to the <code>price_btc</code> column.</p>

<p>In general when dealing with migrations in Django 1.7, it&rsquo;s best to think of loading data as a separate exercise from migrating the database. If you do want to continue to use/load fixtures, you can use a command like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="err">$</span> <span class="o">./</span><span class="n">manage</span><span class="o">.</span><span class="n">py</span> <span class="n">loaddata</span> <span class="n">historical_data</span><span class="o">/</span><span class="n">fixtures</span><span class="o">/</span><span class="n">initial_data</span><span class="o">.</span><span class="n">json</span>
</span></code></pre></td></tr></table></div></figure>


<p>This will load data from the fixture into the database.</p>

<p>This doesn&rsquo;t happen automatically as with a data migration (which is probably a good thing), but the functionality is still there; it hasn&rsquo;t been lost, so feel free to continue to use fixtures if you have a need. The difference is that now you load data with fixtures when you need it. This is something to keep in mind if you are using fixtures to load test data for your unit tests.</p>

<a name="Conclusion"></a>
<h2>Conclusion</h2>

<p>This, along with the previous two articles, covers the most common scenarios you&rsquo;ll encounter when using migrations. There are plenty more scenarios, and if you&rsquo;re curious and really want to dive into migrations, the best place to go (other than the code itself) is the <a href="https://docs.djangoproject.com/en/1.7/topics/migrations/">official docs</a>. It&rsquo;s the most up-to-date and does a pretty good job of explaining how things work. <em>If there is a more complex scenario that you would like to see an example of, please let us know by commenting below.</em></p>

<p>Remember that in the general case, you are dealing with either:</p>

<ol>
<li><p><strong>Schema Migrations</strong> &ndash; a change to the structure of the database or tables with no change to the data. This is the most common type, and Django can generally create these migrations for you automatically.</p></li>
<li><p><strong>Data Migrations</strong> &ndash; a change to the data, or loading new data. Django cannot generate these for you. They must be created manually using the <code>RunPython</code> migration.</p></li>
</ol>


<p>So pick the migration that is correct for you, run <code>makemigrations</code> and then just be sure to update your migration files every time you update your model &ndash; and that&rsquo;s more or less it. That will allow you to keep your migrations stored with your code in git and ensure that you can update your database structure without having to lose data.</p>

<p><strong>Happy migrating!</strong></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Digging Deeper into Migrations]]></title>
    <link href="https://realpython.com/blog/python/digging-deeper-into-migrations/"/>
    <updated>2014-07-23T05:14:57-07:00</updated>
    <id>https://realpython.com/blog/python/digging-deeper-into-migrations</id>
    <content type="html"><![CDATA[<div class="center-text">
  <img class="no-border" src="https://realpython.com/images/blog_images/django-migrations.png" style="max-width: 500px;">
</div>


<p>This is the second article in our Django migrations series:</p>

<ul>
<li>Part 1: <a href="https://realpython.com/blog/python/django-migrations-a-primer/">Django Migrations &ndash; A Primer</a></li>
<li><strong>Part 2: Digging Deeper into Migrations (current article)</strong></li>
<li>Part 3: <a href="https://realpython.com/blog/python/data-migrations">Data Migrations</a></li>
<li>Video: <a href="https://realpython.com/blog/python/django-migrations-a-primer/#video">Django 1.7 Migrations &ndash; primer</a></li>
</ul>


<p>We&rsquo;re back!</p>

<p>Last time we went over the basics of using the new Django migrations system.</p>

<p>Jumping right back in to where we left off, what happens when things don&rsquo;t work as they should? Well, that&rsquo;s when you may have to go searching through your previous migrations to try to figure out what&rsquo;s going on. <em>To help with that let&rsquo;s dig a bit deeper to get a better understanding of how migrations work.</em></p>

<a name="How.Migrations.Know.What.to.Migrate"></a>
<h2>How Migrations Know What to Migrate</h2>

<p>Try this. From the <code>bitcoin_tracker</code> app run the migration again (<code>./manage.py migrate</code>). What happens? Nothing. And that&rsquo;s exactly the point.</p>

<p>By default Django will never run a migration more than once on the same database. This is managed by a table called <code>django_migrations</code> that is created in your database the first time migrations are ran. For each migration that is ran or faked, a new row is inserted into the table.</p>

<p>For example, here is what the table might look like after running our initial migration:</p>

<table style="
    font-size: 16px;border-spacing: 10px 0px;border-collapse: separate;
">
    <thead>
        <tr>
            <th>ID</th>
            <th>app</th>
            <th>name</th>
            <th>applied</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>1</td>
            <td>historical_payments</td>
            <td>0001_initial</td>
            <td>2014-04-16 14:12:30.839899+08</td>
        </tr>
    </tbody>
</table>




<br>


<p>Not very interesting because there is just one migration, but there will be new rows added for each subsequent migration.</p>

<p>The next time migrations are run, it will skip the migration files listed in the database table. This means that even if you change the migration file manually, it will be skipped if there is already an entry for it in the database.</p>

<p>This makes sense as you generally don&rsquo;t want to run migrations twice. But if for whatever reason you do, one way to get it to run again is to first delete the corresponding row from the database (Do note this is not an &ldquo;officially recommended way&rdquo;, but it will work). In the case of upgrading from <a href="http://south.aeracode.org/">South</a> the first time you run migrations, Django will first check the database structure, and if it is the same as the migration (i.e., the migration doesn&rsquo;t apply any new changes) then the migration will be &ldquo;faked&rdquo; meaning not really ran, but the <code>django_migrations</code> table will still be updated.</p>

<p>Conversely, if you want to &ldquo;undo&rdquo; all the migrations for a particular app, you can migrate to a special migration called zero.</p>

<p>For example if you type:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>./manage.py migrate historical_data zero
</span></code></pre></td></tr></table></div></figure>


<p>It will undo/reverse all the migrations for the <code>historical_data</code> app. In addition to using zero; you can also use any arbitrary migration, and if that migration is in the past then the database will be rolled back to the state of that migration, or rolled forward if the migration hasn&rsquo;t yet ran. Pretty powerful stuff!</p>

<a name="The.Migration.File"></a>
<h2>The Migration File</h2>

<p>What about creating the actual migration file? In other words, what exactly happens when you run <code>./manage.py makemigrations &lt;appname&gt;</code>?</p>

<p>Django migrations are actually creating a migration file that describes how to create the appropriate tables in the database. In fact, you can look at the migration file that was created. Don&rsquo;t worry: It&rsquo;s just Python.</p>

<blockquote><p>Don&rsquo;t forget to <code>git add</code> the new migrations directory so it is version-controlled.</p></blockquote>

<p>The <code>historical_prices</code> app will now have a sub-directory called <code>/migrations</code> where all the migration files for that app will reside. Let&rsquo;s look at <code>historical_data/migrations/0001_initial.py</code>, as this is the file where the initial migration code is created. It should look similar to:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># encoding: utf8</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">models</span><span class="p">,</span> <span class="n">migrations</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Migration</span><span class="p">(</span><span class="n">migrations</span><span class="o">.</span><span class="n">Migration</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">dependencies</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">operations</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>        <span class="n">migrations</span><span class="o">.</span><span class="n">CreateModel</span><span class="p">(</span>
</span><span class='line'>            <span class="n">name</span><span class="o">=</span><span class="s">&#39;PriceHistory&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="n">fields</span><span class="o">=</span><span class="p">[</span>
</span><span class='line'>                <span class="p">(</span><span class="s">&#39;id&#39;</span><span class="p">,</span> <span class="n">models</span><span class="o">.</span><span class="n">AutoField</span><span class="p">(</span><span class="n">verbose_name</span><span class="o">=</span><span class="s">&#39;ID&#39;</span><span class="p">,</span> <span class="n">serialize</span><span class="o">=</span><span class="bp">False</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">auto_created</span><span class="o">=</span><span class="bp">True</span><span class="p">)),</span>
</span><span class='line'>                <span class="p">(</span><span class="s">&#39;date&#39;</span><span class="p">,</span> <span class="n">models</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">(</span><span class="n">auto_now_add</span><span class="o">=</span><span class="bp">True</span><span class="p">)),</span>
</span><span class='line'>                <span class="p">(</span><span class="s">&#39;price&#39;</span><span class="p">,</span> <span class="n">models</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">(</span><span class="n">decimal_places</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">max_digits</span><span class="o">=</span><span class="mi">5</span><span class="p">)),</span>
</span><span class='line'>                <span class="p">(</span><span class="s">&#39;volume&#39;</span><span class="p">,</span> <span class="n">models</span><span class="o">.</span><span class="n">PositiveIntegerField</span><span class="p">()),</span>
</span><span class='line'>                <span class="p">(</span><span class="s">&#39;total_btc&#39;</span><span class="p">,</span> <span class="n">models</span><span class="o">.</span><span class="n">PositiveIntegerField</span><span class="p">()),</span>
</span><span class='line'>            <span class="p">],</span>
</span><span class='line'>            <span class="n">options</span><span class="o">=</span><span class="p">{</span>
</span><span class='line'>            <span class="p">},</span>
</span><span class='line'>            <span class="n">bases</span><span class="o">=</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">,),</span>
</span><span class='line'>        <span class="p">),</span>
</span><span class='line'>    <span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>For a migration to work, you must create a class called <code>Migration()</code> that inherits from <code>django.db.migrations.Migration</code>. This is the class that the migration framework will look for and execute when you ask it to run migrations (which we will do later).</p>

<p>The Migration class contains two main lists, <code>dependencies</code> and <code>operations</code>.</p>

<a name="Migration.dependencies"></a>
<h2>Migration dependencies</h2>

<p><code>dependencies</code> is a list of migrations that must be ran prior to this migration being run.</p>

<p>In the case above nothing has to be run prior so there are no dependencies. But if you have foreign key relationships, for example, then you will have to ensure a model is created before you can add a foreign key to it. So let&rsquo;s assume we had another app called <code>main</code> that defined the table we wanted to reference in our foreign key. Then our dependencies list might look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">dependencies</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>   <span class="p">(</span><span class="s">&#39;main&#39;</span><span class="p">,</span> <span class="s">&#39;__first__&#39;</span><span class="p">),</span>
</span><span class='line'><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>The dependency above says that migrations for the <code>main</code> app must be run first.</p>

<blockquote><p>Be sure check out the <a href="https://realpython.com/blog/python/django-migrations-a-primer/#video">video</a> to see examples of utilizing foreign keys and how they affect the dependencies within the migration files.</p></blockquote>

<p>You can also have a dependency on a specific file, like so:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">dependencies</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>    <span class="p">(</span><span class="s">&#39;main&#39;</span><span class="p">,</span> <span class="s">&#39;0001_initial&#39;</span><span class="p">),</span>
</span><span class='line'><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is a dependency for the file called <code>0001_initial</code> from the <code>main</code> app.</p>

<p>Dependencies can also be combined so you can have multiple dependencies. This functionality provides a lot of flexibility, as you can accommodate foreign keys that depend upon models from different apps. It also means that the numbering of the migrations (usually 0001, 0002, 0003, &hellip;) doesn&rsquo;t strictly have to be in the order they are applied. You can add any dependency you want and thus control the order without having to re-number all the migrations.</p>

<a name="Migration.operations"></a>
<h3>Migration operations</h3>

<p>The second list in the <code>Migration()</code> class is the <code>operations</code> list. This is a list of operations to be applied as part of the migration. Generally the operations can fall under one of the following types:</p>

<ul>
<li><strong>CreateModel</strong>: You guessed it: this creates a new model. See the migration above for an example.</li>
<li><strong>DeleteModel</strong>: removes a table from the database; just pass in the name of the model.</li>
<li><strong>RenameModel</strong>: Given the <code>old_name</code> and <code>new_name</code>, this renames the model.</li>
<li><strong>AlterModelTable</strong>: changes the name of the table associated with a model. Same as the <code>db_table</code> option.</li>
<li><strong>AlterUniqueTogether</strong>: changes unique constraints.</li>
<li><strong>AlteIndexTogether</strong>: changes the set of custom indexes for the model.</li>
<li><p><strong>AddField</strong>: Just like it sounds. Here is an example:</p>

<p>  <code>python
  migrations.AddField(
      model_name='PriceHistory',
      name='market_cap',
      field=models.PositiveIntegerField(),
  ),
 </code></p></li>
<li><p><strong>RemoveField</strong>: We don&rsquo;t want that field anymore&hellip; just drop it.</p></li>
<li><strong>RenameField</strong>: Given <code>model_name</code>, <code>old_name</code> and <code>new_name</code>, this changes the field with <code>old_name</code> to <code>new_name</code>.</li>
</ul>


<p>There are also a few &ldquo;special&rdquo; operations:</p>

<ul>
<li><strong>RunSQL</strong>: This allows you to pass in raw SQL and execute it as part of your model.</li>
<li><strong>RunPython</strong>: passes in a callable to be executed; useful for things like data loading as part of the migration.</li>
</ul>


<p><em>You can even write your own operations.</em> Generally when you run <code>makemigrations</code>, Django will create the necessary migrations with the appropriate dependencies and operations that you need. However, understanding the migration files themselves and how they work give you more flexibility.</p>

<a name="Example"></a>
<h2>Example</h2>

<p>Let&rsquo;s make a few more changes to our model to see the effect on the migrations:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">PriceHistory</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
</span><span class='line'>    <span class="n">date</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">(</span><span class="n">auto_now_add</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</span><span class='line'>    <span class="c">#bitcoin to the moon (we need more digits)</span>
</span><span class='line'>    <span class="n">price</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">(</span><span class="n">max_digits</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">decimal_places</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
</span><span class='line'>    <span class="n">volume</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">PositiveIntegerField</span><span class="p">()</span>
</span><span class='line'>    <span class="n">total_btc</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">PositiveIntegerField</span><span class="p">()</span>
</span><span class='line'>    <span class="n">market_cap</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">PositiveIntegerField</span><span class="p">(</span><span class="n">null</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Being bullish on bitcoin we have decided we need a larger number for the price field, and we have also decided to keep track of the market capitalization. Notice how we made the <code>market_cap</code> field nullable. If we didn&rsquo;t, migrations will ask to supply a value for all the existing rows (just like South does):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>You are trying to add a non-nullable field <span class="s1">&#39;market_cap&#39;</span> to PriceHistory without a default<span class="p">;</span>
</span><span class='line'>we can<span class="err">&#39;</span>t <span class="k">do </span>that <span class="o">(</span>the database needs something to populate existing rows<span class="o">)</span>.
</span><span class='line'>Please <span class="k">select </span>a fix:
</span><span class='line'> 1<span class="o">)</span> Provide a one-off default now <span class="o">(</span>will be <span class="nb">set </span>on all existing rows<span class="o">)</span>
</span><span class='line'> 2<span class="o">)</span> Quit, and <span class="nb">let </span>me add a default in models.py
</span></code></pre></td></tr></table></div></figure>


<p>Now running <code>./manage.py makemigrations</code> again will produce a new migration file <code>0002_auto_&lt;date_time_stamp&gt;</code>.</p>

<p>That file should look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">Migration</span><span class="p">(</span><span class="n">migrations</span><span class="o">.</span><span class="n">Migration</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">dependencies</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>        <span class="p">(</span><span class="s">&#39;historical_data&#39;</span><span class="p">,</span> <span class="s">&#39;0001_initial&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">operations</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>        <span class="n">migrations</span><span class="o">.</span><span class="n">AddField</span><span class="p">(</span>
</span><span class='line'>            <span class="n">model_name</span><span class="o">=</span><span class="s">&#39;PriceHistory&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="n">name</span><span class="o">=</span><span class="s">&#39;market_cap&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="n">field</span><span class="o">=</span><span class="n">models</span><span class="o">.</span><span class="n">PositiveIntegerField</span><span class="p">(</span><span class="n">null</span><span class="o">=</span><span class="bp">True</span><span class="p">),</span>
</span><span class='line'>            <span class="n">preserve_default</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
</span><span class='line'>        <span class="p">),</span>
</span><span class='line'>        <span class="n">migrations</span><span class="o">.</span><span class="n">AlterField</span><span class="p">(</span>
</span><span class='line'>            <span class="n">model_name</span><span class="o">=</span><span class="s">&#39;PriceHistory&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="n">name</span><span class="o">=</span><span class="s">&#39;price&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="n">field</span><span class="o">=</span><span class="n">models</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">(</span><span class="n">max_digits</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">decimal_places</span><span class="o">=</span><span class="mi">2</span><span class="p">),</span>
</span><span class='line'>        <span class="p">),</span>
</span><span class='line'>    <span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice the &lsquo;dependencies&rsquo; list which declares that we have to run our initial migration prior to running this one. Also this migration has two operations &ndash; <code>AddField</code>, which creates our newly added <code>market_cap</code>, and <code>AlterField</code>, which updates the <code>max_digits</code> of our <code>price</code> field.</p>

<p>It&rsquo;s important to understand that these operations just call the migrations framework, which handles performing the various operations against the database that is defined in your <code>settings.py</code> file.</p>

<p><strong>Out of the box migrations have support for all the standard databases that Django supports. So if you stick to the primitives listed in dependencies section you can manually create whatever migration you want, without having to worry about the underlying SQL. That&rsquo;s all done for you.</strong></p>

<a name="Conclusion"></a>
<h2>Conclusion</h2>

<p>We&rsquo;ve come to another end, but there&rsquo;s one more beginning. In the last post, we&rsquo;ll look at Data Migrations. Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Face detection in Python using a webcam]]></title>
    <link href="https://realpython.com/blog/python/face-detection-in-python-using-a-webcam/"/>
    <updated>2014-07-22T04:14:28-07:00</updated>
    <id>https://realpython.com/blog/python/face-detection-in-python-using-a-webcam</id>
    <content type="html"><![CDATA[<p><em>The following is a guest post by Shantnu Tiwari, who suffered at the hands of C/C++ for several years before he discovered Python, and it felt like a breath of fresh air.</em></p>

<p><em>He is now <a href="https://www.kickstarter.com/projects/513736598/python-for-science-and-engineering">sharing his love</a>.</em></p>

<hr>


<blockquote><p>This blog post is a follow-up to <a href="https://realpython.com/blog/python/face-recognition-with-python/">Face Recognition in Python</a>, so make sure you&rsquo;ve gone through that first post.</p></blockquote>

<p>As I mentioned in the first post, it&rsquo;s quite easy to move from detecting faces in images to detecting them in video via a webcam &ndash; which is exactly what we will detail in this post.</p>

<a name="Pre-requisites:"></a>
<h2>Pre-requisites:</h2>

<ol>
<li>OpenCV installed (see the previous blog post for details)</li>
<li>A working webcam</li>
</ol>


<a name="The.Code"></a>
<h2>The Code</h2>

<p>Let&rsquo;s dive straight into the code, taken from this <a href="https://github.com/shantnu/Webcam-Face-Detect">repository</a>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">cv2</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">sys</span>
</span><span class='line'>
</span><span class='line'><span class="n">cascPath</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span class='line'><span class="n">faceCascade</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">CascadeClassifier</span><span class="p">(</span><span class="n">cascPath</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">video_capture</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">VideoCapture</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
</span><span class='line'>    <span class="c"># Capture frame-by-frame</span>
</span><span class='line'>    <span class="n">ret</span><span class="p">,</span> <span class="n">frame</span> <span class="o">=</span> <span class="n">video_capture</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">gray</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">cvtColor</span><span class="p">(</span><span class="n">frame</span><span class="p">,</span> <span class="n">cv2</span><span class="o">.</span><span class="n">COLOR_BGR2GRAY</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">faces</span> <span class="o">=</span> <span class="n">faceCascade</span><span class="o">.</span><span class="n">detectMultiScale</span><span class="p">(</span>
</span><span class='line'>        <span class="n">gray</span><span class="p">,</span>
</span><span class='line'>        <span class="n">scaleFactor</span><span class="o">=</span><span class="mf">1.1</span><span class="p">,</span>
</span><span class='line'>        <span class="n">minNeighbors</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span>
</span><span class='line'>        <span class="n">minSize</span><span class="o">=</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">30</span><span class="p">),</span>
</span><span class='line'>        <span class="n">flags</span><span class="o">=</span><span class="n">cv2</span><span class="o">.</span><span class="n">cv</span><span class="o">.</span><span class="n">CV_HAAR_SCALE_IMAGE</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># Draw a rectangle around the faces</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span> <span class="ow">in</span> <span class="n">faces</span><span class="p">:</span>
</span><span class='line'>        <span class="n">cv2</span><span class="o">.</span><span class="n">rectangle</span><span class="p">(</span><span class="n">frame</span><span class="p">,</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">),</span> <span class="p">(</span><span class="n">x</span><span class="o">+</span><span class="n">w</span><span class="p">,</span> <span class="n">y</span><span class="o">+</span><span class="n">h</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># Display the resulting frame</span>
</span><span class='line'>    <span class="n">cv2</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="s">&#39;Video&#39;</span><span class="p">,</span> <span class="n">frame</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="n">cv2</span><span class="o">.</span><span class="n">waitKey</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFF</span> <span class="o">==</span> <span class="nb">ord</span><span class="p">(</span><span class="s">&#39;q&#39;</span><span class="p">):</span>
</span><span class='line'>        <span class="k">break</span>
</span><span class='line'>
</span><span class='line'><span class="c"># When everything is done, release the capture</span>
</span><span class='line'><span class="n">video_capture</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span class='line'><span class="n">cv2</span><span class="o">.</span><span class="n">destroyAllWindows</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now let&rsquo;s break it down&hellip;</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">cv2</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">sys</span>
</span><span class='line'>
</span><span class='line'><span class="n">cascPath</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span class='line'><span class="n">faceCascade</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">CascadeClassifier</span><span class="p">(</span><span class="n">cascPath</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This should be familiar to you. We are creating a face cascade, as we did in the image example.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">video_capture</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">VideoCapture</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This line sets the video source to the default webcam, which OpenCV can easily capture.</p>

<blockquote><p><strong>NOTE</strong>: You can also provide a filename here, and Python will read in the video file. However, you need to have <a href="https://www.ffmpeg.org/">ffmpeg</a> installed for that since OpenCV itself cannot decode compressed video. Ffmpeg acts as the front end for OpenCV, and, ideally, it should be compiled directly into OpenCV. This is not easy to do, especially on Windows.</p></blockquote>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
</span><span class='line'>    <span class="c"># Capture frame-by-frame</span>
</span><span class='line'>    <span class="n">ret</span><span class="p">,</span> <span class="n">frame</span> <span class="o">=</span> <span class="n">video_capture</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here, we capture the video. The <code>read()</code> function reads one frame from the video source, which in this example is the webcam. This returns:</p>

<ol>
<li>The actual video frame read (one frame on each loop)</li>
<li>A return code</li>
</ol>


<p>The return code tells us if we have run out of frames, which will happen if we are reading from a file. This doesn&rsquo;t matter when reading from the webcam, since we can record forever, so we will ignore it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Capture frame-by-frame</span>
</span><span class='line'><span class="n">ret</span><span class="p">,</span> <span class="n">frame</span> <span class="o">=</span> <span class="n">video_capture</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'><span class="n">gray</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">cvtColor</span><span class="p">(</span><span class="n">frame</span><span class="p">,</span> <span class="n">cv2</span><span class="o">.</span><span class="n">COLOR_BGR2GRAY</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">faces</span> <span class="o">=</span> <span class="n">faceCascade</span><span class="o">.</span><span class="n">detectMultiScale</span><span class="p">(</span>
</span><span class='line'>    <span class="n">gray</span><span class="p">,</span>
</span><span class='line'>    <span class="n">scaleFactor</span><span class="o">=</span><span class="mf">1.1</span><span class="p">,</span>
</span><span class='line'>    <span class="n">minNeighbors</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span>
</span><span class='line'>    <span class="n">minSize</span><span class="o">=</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">30</span><span class="p">),</span>
</span><span class='line'>    <span class="n">flags</span><span class="o">=</span><span class="n">cv2</span><span class="o">.</span><span class="n">cv</span><span class="o">.</span><span class="n">CV_HAAR_SCALE_IMAGE</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Draw a rectangle around the faces</span>
</span><span class='line'><span class="k">for</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span> <span class="ow">in</span> <span class="n">faces</span><span class="p">:</span>
</span><span class='line'>    <span class="n">cv2</span><span class="o">.</span><span class="n">rectangle</span><span class="p">(</span><span class="n">frame</span><span class="p">,</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">),</span> <span class="p">(</span><span class="n">x</span><span class="o">+</span><span class="n">w</span><span class="p">,</span> <span class="n">y</span><span class="o">+</span><span class="n">h</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Display the resulting frame</span>
</span><span class='line'><span class="n">cv2</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="s">&#39;Video&#39;</span><span class="p">,</span> <span class="n">frame</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Again, this code should be familiar. We are merely searching for the face in our captured frame.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">if</span> <span class="n">cv2</span><span class="o">.</span><span class="n">waitKey</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFF</span> <span class="o">==</span> <span class="nb">ord</span><span class="p">(</span><span class="s">&#39;q&#39;</span><span class="p">):</span>
</span><span class='line'>    <span class="k">break</span>
</span></code></pre></td></tr></table></div></figure>


<p>We wait for the &lsquo;q&rsquo; key to be pressed. If it is, we exit the script.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># When everything is done, release the capture</span>
</span><span class='line'><span class="n">video_capture</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
</span><span class='line'><span class="n">cv2</span><span class="o">.</span><span class="n">destroyAllWindows</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here, we are just cleaning up.</p>

<a name="Test."></a>
<h2>Test!</h2>

<div class="embed-video-container"><iframe src="https://player.vimeo.com/video/100839478 " style="width: 420px; height: 345px;"></iframe></div>


<p>So, that&rsquo;s me with my driver&rsquo;s license in my hand. And you can see that the algorithm tracks both the real me and the photo me. Note that when I move slowly, the algorithm can keep up. When I move my hand up to my face a bit faster, though, it gets confused and mistakes my wrist for a face.</p>

<p>Like I said in the last post, machine learning based algorithms are rarely 100% accurate. We aren&rsquo;t at the stage where Robocop driving his motorcycle at 100 mph can track criminals using low quality CCTV cameras&hellip; yet.</p>

<p>The code searches for the face frame by frame, so it will take a fair amount of processing power. For example, on my five year old laptop, it took almost 90% of the CPU.</p>

<a name="Next.Steps"></a>
<h2>Next Steps</h2>

<p>Okay, so you know how to detect faces. But what if you want to detect your own object, like your car or your TV or your favorite toy?</p>

<p>OpenCV allows you to create your own cascades, but the process isn&rsquo;t well documented. Here is a <a href="http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html">blog</a> post that shows you how to train your own cascade to detect a banana.</p>

<p>If you want to take it one step further and recognize individual faces &ndash; perhaps to detect and recognize your face amongst many strangers &ndash; the task is surprisingly difficult. This is mainly due to  the large amount of image pre-processing involved. But if you are willing to tackle the challenge, it is possible by using machine learning algorithms as described <a href="http://scikit-learn.sourceforge.net/0.6/auto_examples/applications/plot_face_recognition.html">here</a>.</p>

<a name="Want.to.know.more."></a>
<h2>Want to know more?</h2>

<p>This will be covered in much greater detail along with a number of computational science and machine learning topics and more in my upcoming course. The course is based on a highly successful <a href="https://www.kickstarter.com/projects/513736598/python-for-science-and-engineering">Kickstarter</a>.</p>

<p>The Kickstarter is over, but you can still order the course at <a href="http://pythonforengineers.com/">Python for Engineers</a>. Visit to find out more.</p>

<p>Also, post links to your videos below to get direct feedback from me. Comment if you have questions.</p>

<p>Oh &ndash; and next time we&rsquo;ll be tackling some motion detection. Stay tuned!</p>

<p>Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Django Migrations - A Primer]]></title>
    <link href="https://realpython.com/blog/python/django-migrations-a-primer/"/>
    <updated>2014-07-21T07:14:29-07:00</updated>
    <id>https://realpython.com/blog/python/django-migrations-a-primer</id>
    <content type="html"><![CDATA[<div class="center-text">
  <img class="no-border" src="https://realpython.com/images/blog_images/django-migrations.png" style="max-width: 500px;">
</div>


<p>What&rsquo;s new in Django 1.7? Basically migrations. While there are some other nice features, the new migrations system is the big one.</p>

<p>In the past you probably used <a href="http://south.aeracode.org/">South</a> to handle database changes. However, in Django 1.7, migrations are now integrated into the Django Core thanks to Andrew Godwin, who ran <a href="https://www.kickstarter.com/projects/andrewgodwin/schema-migrations-for-django">this Kickstarter</a>. He is also the original creator of South.</p>

<p>In honor of this momentous update, we are going to cover migrations, how they work and how to get the most out of them across three blog posts and one video:</p>

<ul>
<li><strong>Part 1: Django Migrations &ndash; A Primer (current article)</strong></li>
<li>Part 2: <a href="https://realpython.com/blog/python/digging-deeper-into-migrations/">Digging Deeper into Migrations</a></li>
<li>Part 3: <a href="https://realpython.com/blog/python/data-migrations">Data Migrations</a></li>
<li>Video: <a href="https://realpython.com/blog/python/django-migrations-a-primer/#video">Django 1.7 Migrations &ndash; primer</a></li>
</ul>


<p>Let&rsquo;s begin&hellip;</p>

<a name="The.problems.that.Migrations.Solve"></a>
<h2>The problems that Migrations Solve</h2>

<p>Migrations:</p>

<ol>
<li>Speed up the notoriously slow process of changing a database schema.</li>
<li>Make it easy to use git to track your database schema and its associated changes. Databases simply aren&rsquo;t aware of git or other version control systems. Git is awesome for code, but not so much for database schemas.</li>
<li>Provide an easy way to maintain fixture data linked to the appropriate schema.</li>
<li>Keep the code and schema in sync.</li>
</ol>


<p>Have you ever had to make a change to an existing table (like re-naming a field) and you didn&rsquo;t want to mess with dropping the table and re-adding it?</p>

<p>Migrations solve that.</p>

<p>Or perhaps you needed to update the schema on a live application with millions of rows of data that simply cannot be lost.</p>

<p>Migrations make this much easier.</p>

<p>In general, migrations allow you to manage and work with your database schema in the same way you would with your Django code. You can store versions of it in git, you can update it from the command line, and you don&rsquo;t have to worry about creating large complex SQL queries to keep everything up to date &ndash; although you still can if you love pain&hellip; I mean SQL.</p>

<a name="Getting.Started.with.Migrations"></a>
<h2>Getting Started with Migrations</h2>

<p>For this blog post we are going to create a simple bitcoin tracker app (actually we are just going to create the model).</p>

<blockquote><p>Be sure check out the <a href="https://realpython.com/blog/python/django-migrations-a-primer/#video">video</a> to see examples of the migrations workflow.</p></blockquote>

<a name="Setup.the.project"></a>
<h3>Setup the project</h3>

<p>With Django 1.7 installed you can create the project using the following commands:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>django-admin.py startproject bitcoin_tracker
</span><span class='line'><span class="nv">$ </span><span class="nb">cd </span>bitcoin_tracker
</span><span class='line'><span class="nv">$ </span>./manage.py startapp historical_data
</span></code></pre></td></tr></table></div></figure>


<p>That should give you a simple project with an app called <code>historical_data</code>. Now to create a model edit <code>historical_data/models.py</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">PriceHistory</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
</span><span class='line'>    <span class="n">date</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">(</span><span class="n">auto_now_add</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</span><span class='line'>    <span class="n">price</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">(</span><span class="n">max_digits</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">decimal_places</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
</span><span class='line'>    <span class="n">volume</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">PositiveIntegerField</span><span class="p">()</span>
</span><span class='line'>    <span class="n">total_btc</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">PositiveIntegerField</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Also don&rsquo;t forget to add the newly created app to <code>settings.INSTALLED_APPS</code>.</p>

<p>This is a basic model to keep track of bitcoin prices.</p>

<a name="Create.the.migrations"></a>
<h3>Create the migrations</h3>

<p>With the model created, the first thing we need to do is &ldquo;initialize&rdquo; our migrations. We can do this with the following command:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>./manage.py makemigrations historical_data
</span></code></pre></td></tr></table></div></figure>


<blockquote><p><strong>Note:</strong> Specifying the name of the application, <code>historical_data</code>, is optional. Leaving it off will create migrations for all apps.</p></blockquote>

<p>Upon running the above command Django migrations will create the migrations for you and output an informational message such as:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>Migrations <span class="k">for</span> <span class="s1">&#39;historical_data&#39;</span>:
</span><span class='line'>  0001_initial.py:
</span><span class='line'>    - Create model PriceHistory
</span></code></pre></td></tr></table></div></figure>


<p>This creates the migrations files which instruct Django on how to create the models that you need.</p>

<a name="Apply.migrations"></a>
<h3>Apply migrations</h3>

<p>Then to apply the models (e.g., update the database) just run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>./manage.py migrate
</span></code></pre></td></tr></table></div></figure>


<p>Not only will this apply the migrations we just created for <code>PriceHistory</code> but since this is a new app, it will create all the Django tables for us as well (just like <code>syncdb</code> did in Django versions prior to 1.7).</p>

<a name="Workflow"></a>
<h3>Workflow</h3>

<p>So the basic process for using migrations looks like this:</p>

<ol>
<li>Create or update a model.</li>
<li>Run <code>./manage.py makemigrations &lt;app_name&gt;</code>.</li>
<li>Run <code>./manage.py migrate</code> to migrate everything or <code>./manage.py migrate &lt;app_name&gt;</code> to migrate an individual app.</li>
<li>Repeat as necessary.</li>
</ol>


<p>That&rsquo;s it! Pretty straight-forward for the basic use-case. Fortunately, this basic use case will work the majority of the time!</p>

<a name="Apply.Migrations.to.an.Existing.Project"></a>
<h2>Apply Migrations to an Existing Project</h2>

<p>That&rsquo;s all well and good if you&rsquo;re starting from scratch but many people will be upgrading from a previous version of Django and migrating from South.</p>

<p>To do that, Django recommends to just start using the new migrations system and everything should work. The recommended upgrade path from South to Django 1.7 migrations, paraphrased from <a href="https://docs.djangoproject.com/en/dev/topics/migrations/#upgrading-from-south">here</a> is basically:</p>

<ol>
<li>Delete all your South migration files (yup &ndash; just blow &lsquo;em away).</li>
<li>Run <code>./manage.py makemigrations</code>. Django will just make initial migrations files based upon your current models.</li>
<li>Run <code>./manage.py migrate</code>. Django will see the tables that already exist for your migrations and just mark them as completed without running them.</li>
</ol>


<p>Now, if you have circular dependencies and are getting errors when going through the above process, you may have to fake the migration with:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>./manage.py migrate --fake &lt;appname&gt;
</span></code></pre></td></tr></table></div></figure>


<p>Also, if you have a need to support both South and Django Migrations at the same time then upgrade to South 1.0 and read <a href="http://treyhunner.com/2014/03/migrating-to-django-1-dot-7/">this article</a>.</p>

<a name="South.vs.Django.migrations"></a>
<h2>South vs Django migrations</h2>

<p>For those familiar with South this should feel pretty familiar and probably a little bit cleaner.  For easy reference the following table compares the old South workflow to the new Django Migrations workflow:</p>

<table style="
    font-size: 16px;border-spacing: 10px 0px;border-collapse: separate;
">
<thead>
<tr>
<th style="
">Step    </th>
<th>  South                         </th>
<th> Django migrations</th>
</tr>
</thead>
<tbody>
<tr>
<td>initial migration </td>
<td> <ol><li>run <code>syncdb</code></li><li>then <code>./manage.py schemamigration &lt;appname&gt; --initial</code></li></ol> </td>
<td> <code>./manage.py makemigrations &lt;appname&gt;</code></td>
</tr>
<tr>
<td>apply migration </td>
<td> <code>./manage.py migrate &lt;appname&gt;</code>  </td>
<td> <code>./manage.py migrate &lt;appname&gt;</code></td>
</tr>
<tr>
<td>non-first migration </td>
<td> <code>./manage.py schemamigration &lt;appname&gt; --auto</code> </td>
<td> <code>./manage.py makemigration &lt;appname&gt;</code></td>
</tr>
</tbody>
</table>




<br>


<p>So from the table we can see that Django Migrations, basically follows the same process as South (at least for the standard migration process) &ndash; it just simplifies things a bit.</p>

<a name="Conclusion"></a>
<h2>Conclusion</h2>

<p>That&rsquo;s it. It&rsquo;s all meant to be very straight forward. Of course there will always be edge cases when things don&rsquo;t work out exactly as intended &ndash; but we&rsquo;ll save that for next time.</p>

<p>Cheers!</p>

<a name="Video"></a>
<h2>Video</h2>

<div class="embed-video-container"><iframe src="https://www.youtube.com/embed/7PiyO-N6Pho" allowfullscreen style="width: 420px; height: 345px;"></iframe></div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Face Recognition with Python, in under 25 lines of code]]></title>
    <link href="https://realpython.com/blog/python/face-recognition-with-python/"/>
    <updated>2014-07-07T13:24:47-07:00</updated>
    <id>https://realpython.com/blog/python/face-recognition-with-python</id>
    <content type="html"><![CDATA[<p><em>The following is a guest post by Shantnu Tiwari, who has worked in the low level/embedded domain for ten years. Shantnu suffered at the hands of C/C++ for several years before he discovered Python, and it felt like a breath of fresh air. He is now trying to <a href="https://www.kickstarter.com/projects/513736598/python-for-science-and-engineering">share his love</a>.</em></p>

<hr>


<p>In this post we&rsquo;ll look at a surprisingly simple way to get started with face recognition using Python and the open source library <a href="http://opencv.org/">OpenCV</a>.</p>

<a name="OpenCV"></a>
<h2>OpenCV</h2>

<p>OpenCV is the most popular library for computer vision. Originally written in C/C++, it now provides bindings for Python.</p>

<p>OpenCV uses machine learning algorithms to search for faces within a picture. For something as complicated as a face, there isn&rsquo;t one simple test that will tell you if it found a face or not. Instead, there are thousands of small patterns/features that must be matched. The algorithms break the task of identifying the face into thousands of smaller, bite-sized tasks, each of which is easy to solve. These tasks are also called <a href="http://en.wikipedia.org/wiki/Statistical_classification">classifiers</a>.</p>

<p>For something like a face, you might have 6,000 or more classifiers, all of which must match for a face to be detected (within error limits, of course). But therein lies the problem: For face detection, the algorithm starts at the top left of a picture and moves down across small blocks of data, looking at each block, constantly asking, &ldquo;<em>Is this a face? &hellip; Is this a face? &hellip; Is this a face</em>?&rdquo; Since there are 6,000 or more tests per block, you might have millions of calculations to do, which will grind your computer to a halt.</p>

<p>To get around this, OpenCV uses <a href="http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html">cascades</a>. What&rsquo;s a cascade? The best answer can be found from the <a href="http://dictionary.reference.com/browse/cascade">dictionary</a>: <em>A waterfall or series of waterfalls</em></p>

<p>Like a series of waterfalls, the OpenCV cascade breaks the problem of detecting faces into multiple stages. For each block, it does a very rough and quick test. If that passes, it does a slightly more detailed test, and so on. The algorithm may have 30-50 of these stages or cascades, and it will only detect a face if all stages pass. The advantage is that the majority of the pictures will return negative during the first few stages, which means the algorithm won&rsquo;t waste time testing all 6,000 features on it. Instead of taking hours, face detection can now be done in real time.</p>

<a name="Cascades.in.practice"></a>
<h3>Cascades in practice</h3>

<p>Though the theory may sound complicated, in practice it is quite easy. The cascades themselves are just a bunch of XML files that contain OpenCV data used to detect objects. You initialize your code with the cascade you want, and then it does the work for you.</p>

<p>Since face detection is such a common case, OpenCV comes with a number of built-in cascades for detecting everything from faces to eyes to hands and legs. There are even cascades for non-human things. For example, if you run a banana shop and want to track people stealing bananas, <a href="http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html">this guy</a> has built one for that!</p>

<a name="Installing.OpenCV"></a>
<h2>Installing OpenCV</h2>

<p>First, you need to find the correct setup file for <a href="http://opencv.org/downloads.html">your operating system</a>.</p>

<p>I found that installing OpenCV was the hardest part of the task. If you get strange unexplainable errors, it could be due to library clashes, 32/64 bit differences, etc. I found it easiest to just use a Linux virtual machine and install OpenCV from scratch.</p>

<p>Once installed, you can test whether or not it works by firing up a Python session and typing:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python
</span><span class='line'>&gt;&gt;&gt; import cv2
</span><span class='line'>&gt;&gt;&gt;
</span></code></pre></td></tr></table></div></figure>


<p>If you don’t get any errors, you can move on to the next part.</p>

<a name="Understanding.the.code"></a>
<h2>Understanding the code</h2>

<p>Let&rsquo;s break down the actual code, which you can download from the <a href="https://github.com/shantnu/FaceDetect/">repo</a>. Grab the <em>face_detect.py</em> script, the <em>abba.png</em> pic, and the <em>haarcascade_frontalface_default.xml</em>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Get user supplied values</span>
</span><span class='line'><span class="n">imagePath</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span class='line'><span class="n">cascPath</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>You first pass in the image and cascade names as command-line arguments. We&rsquo;ll use the Abba image as well as the default cascade for detecting faces provided by OpenCV.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Create the haar cascade</span>
</span><span class='line'><span class="n">faceCascade</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">CascadeClassifier</span><span class="p">(</span><span class="n">cascPath</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we create the cascade and initialize it with our face cascade. This loads the face cascade into memory so it&rsquo;s ready for use. Remember, the cascade is just an XML file that contains the data to detect faces.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Read the image</span>
</span><span class='line'><span class="n">image</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">imread</span><span class="p">(</span><span class="n">imagePath</span><span class="p">)</span>
</span><span class='line'><span class="n">gray</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">cvtColor</span><span class="p">(</span><span class="n">image</span><span class="p">,</span> <span class="n">cv2</span><span class="o">.</span><span class="n">COLOR_BGR2GRAY</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here we read the image and convert it to grayscale. Many operations in OpenCv are done in grayscale.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Detect faces in the image</span>
</span><span class='line'><span class="n">faces</span> <span class="o">=</span> <span class="n">faceCascade</span><span class="o">.</span><span class="n">detectMultiScale</span><span class="p">(</span>
</span><span class='line'>    <span class="n">gray</span><span class="p">,</span>
</span><span class='line'>    <span class="n">scaleFactor</span><span class="o">=</span><span class="mf">1.1</span><span class="p">,</span>
</span><span class='line'>    <span class="n">minNeighbors</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span>
</span><span class='line'>    <span class="n">minSize</span><span class="o">=</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">30</span><span class="p">),</span>
</span><span class='line'>    <span class="n">flags</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">cv</span><span class="o">.</span><span class="n">CV_HAAR_SCALE_IMAGE</span>
</span><span class='line'><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This function detects the actual face &ndash; and is the key part of our code, so let&rsquo;s go over the options.</p>

<ol>
<li><p>The <a href="http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html#cascadeclassifier-detectmultiscale"><code>detectMultiScale</code> function</a> is a general function that detects objects. Since we are calling it on the face cascade, that&rsquo;s what it detects. The first option is the grayscale image.</p></li>
<li><p>The second is the <code>scaleFactor</code>. Since some faces may be closer to the camera, they would appear bigger than those faces in the back. The scale factor compensates for this.</p></li>
<li><p>The detection algorithm uses a moving window to detect objects. <code>minNeighbors</code> defines how many objects are detected near the current one before it declares the face found. <code>minSize</code>, meanwhile, gives the size of each window.</p>

<blockquote><p>I took commonly used values for these fields. In real life, you would experiment with different values for the window size, scale factor, etc., until you find one that best works for you.</p></blockquote></li>
</ol>


<p>The function returns a list of rectangles where it believes it found a face. Next, we will loop over where it thinks it found something.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">print</span> <span class="s">&quot;Found {0} faces!&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">faces</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Draw a rectangle around the faces</span>
</span><span class='line'><span class="k">for</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span> <span class="ow">in</span> <span class="n">faces</span><span class="p">:</span>
</span><span class='line'>    <span class="n">cv2</span><span class="o">.</span><span class="n">rectangle</span><span class="p">(</span><span class="n">image</span><span class="p">,</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">),</span> <span class="p">(</span><span class="n">x</span><span class="o">+</span><span class="n">w</span><span class="p">,</span> <span class="n">y</span><span class="o">+</span><span class="n">h</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="mi">2</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This function returns 4 values: the x and y location of the rectangle, and the rectangle&rsquo;s width and height (<em>w , h</em>).</p>

<p>We use these values to draw a rectangle using the built-in <code>rectangle()</code> function.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">cv2</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="s">&quot;Faces found&quot;</span> <span class="p">,</span><span class="n">image</span><span class="p">)</span>
</span><span class='line'><span class="n">cv2</span><span class="o">.</span><span class="n">waitKey</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the end, we display the image, and wait for the user to press a key.</p>

<a name="Checking.the.results"></a>
<h2>Checking the results</h2>

<p>Let&rsquo;s test against the Abba photo:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python face_detect.py abba.png haarcascade_frontalface_default.xml
</span></code></pre></td></tr></table></div></figure>


<p><img src="https://github.com/shantnu/FaceDetect/raw/master/abba_face_detected.jpg" alt="abba image" /></p>

<p>That worked. How about another photo:</p>

<p><img src="https://github.com/shantnu/FaceDetect/raw/master/little_mix_wrong.jpg" alt="little mix image wrong" /></p>

<p>That &hellip; is not a face. Let&rsquo;s try again. I changed the parameters and found that setting the <code>scaleFactor</code> to 1.2 got rid of the <em>wrong</em> face.</p>

<p><img src="https://github.com/shantnu/FaceDetect/raw/master/little_mix_right.jpg" alt="little mix image right" /></p>

<p><strong>What happened?</strong> Well, the first photo was taken fairly close up with a high quality camera. The second one seems to have been taken from afar and possibly from a mobile phone. This is why the <code>scaleFactor</code> had to be modified. As I said, you&rsquo;ll have to setup the algorithm on a case by case basis to avoid false positives.</p>

<p>Be warned though that since this is based on machine learning, the results will never be 100% accurate. You will get <em>good enough</em> results in most cases, but occasionally the algorithm will identify incorrect objects as faces.</p>

<p>The final code can be found <a href="https://github.com/shantnu/FaceDetect">here</a>.</p>

<a name="Extending.to.a.webcam"></a>
<h2>Extending to a webcam</h2>

<p>So what if you want to use a webcam? OpenCV grabs each frame from the webcam and you can then detect faces by processing each frame. You will need a powerful computer, though my five year old laptop seems to cope fine, as long as I don&rsquo;t dance around too much.</p>

<blockquote><p><strong>UPDATED</strong> The next blog post is live: <a href="https://realpython.com/blog/python/face-detection-in-python-using-a-webcam/">Face Detection in Python Using a Webcam</a>. Check it out!</p></blockquote>

<a name="Want.to.know.more."></a>
<h2>Want to know more?</h2>

<p>I will be covering this and more in my upcoming book Python for Science and Engineering, which is currently on <a href="https://www.kickstarter.com/projects/513736598/python-for-science-and-engineering">Kickstarter</a>. I will also cover machine learning, for those who are interested in it.</p>

<p>Thanks!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Discover Flask, Part 2 - Creating a login page]]></title>
    <link href="https://realpython.com/blog/python/introduction-to-flask-part-2-creating-a-login-page/"/>
    <updated>2014-06-06T12:52:26-07:00</updated>
    <id>https://realpython.com/blog/python/introduction-to-flask-part-2-creating-a-login-page</id>
    <content type="html"><![CDATA[<p>Welcome to the Discover Flask series &hellip;</p>

<p><a href="http://discoverflask.com">http://discoverflask.com</a></p>

<a name="Series.Overview"></a>
<h3>Series Overview</h3>

<table style="font-size: 18px;border-spacing: 10px 0px;border-collapse: separate;">
    <thead>
        <tr>
            <th>Part</th>
            <th>Title</th>
            <th>Tutorial</th>
            <th>Video</th>
        </tr>
    </thead>
    <tbody>
        <tr><td>1</td>
        <td>Setting Up a Static Site</td>
        <td> <a href="http://www.realpython.com/blog/python/introduction-to-flask-part-1-setting-up-a-static-site">Link</a>
        </td>
        <td> <a href="http://youtu.be/WfpFUmV1d0w">Link</a>

        </td>
        </tr>
        <tr>
            <td>2</td>
            <td>Creating a Login Page</td>
            <td> <a href="http://www.realpython.com/blog/python/introduction-to-flask-part-2-creating-a-login-page">Link</a>
            </td>
            <td> <a href="http://youtu.be/bLA6eBGN-_0">Link</a>

            </td>
        </tr>
        <tr>
            <td>3</td>
            <td>User Authentication</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/BnBjhmspw4c">Link</a>

            </td>
        </tr>
        <tr>
            <td>4</td>
            <td>Template Inheritance</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/hNzruwVPtCE">Link</a>

            </td>
        </tr>
        <tr>
            <td>5</td>
            <td>Databases</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/_vrAjAHhUsA">Link</a>

            </td>
        </tr>
        <tr>
            <td>6</td>
            <td>List Comprehensions</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/WqmqNC8Teeo">Link</a>

            </td>
        </tr>
        <tr>
            <td>7</td>
            <td>Unit Tests</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/1aHNs1aEATg">Link</a>

            </td>
        </tr>
        <tr>
            <td>8</td>
            <td>Deploying to Heroku</td>
            <td>N/A</td>
            <td> <a href="https://www.youtube.com/watch?v=L9uD74nHvFY">Link</a>

            </td>
        </tr>
        <tr>
            <td>9</td>
            <td>SQLAlchemy</td>
            <td>N/A</td>
            <td> <a href="https://www.youtube.com/watch?v=kuyrL6krkwA">Link</a>

            </td>
        </tr>
        <tr>
            <td>10</td>
            <td>Configuration</td>
            <td>N/A</td>
            <td> <a href="https://www.youtube.com/watch?v=4Eww3wVZK2I">Link</a>

            </td>
        </tr>
        <tr>
            <td>11</td>
            <td>Secret Key</td>
            <td>N/A</td>
            <td> <a href="https://www.youtube.com/watch?v=tqu9y4iqKVI">Link</a>

            </td>
        </tr>
        <tr>
            <td>12</td>
            <td>Heroku Configuration Settings</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/Y-ONxFkAUJc">Link</a>

            </td>
        </tr>

        <tr>
            <td>13</td>
            <td>Heroku PostgreSQL Setup</td>
            <td>N/A</td>
            <td> <a href="https://www.youtube.com/watch?v=FD0p-opdyoE">Link</a>
            </td>
        </tr>

        <tr>
            <td>14</td>
            <td>Local PostgreSQL Setup</td>
            <td>N/A</td>
            <td> <a href="https://www.youtube.com/watch?v=Up3p20rgWCw">Link</a>
            </td>
        </tr>

        <tr>
            <td>15</td>
            <td>Managing Database Migrations</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/YJibNSI-iaE">Link</a>
            </td>
        </tr>

        <tr>
            <td>16</td>
            <td>Database Downgrades with Flask-Migrate/Alembic</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/5UT1binVuYc">Link</a>
            </td>
        </tr>

    </tbody>
</table>




<hr>


<p>Last <a href="http://www.realpython.com/blog/python/introduction-to-flask-part-1-setting-up-a-static-site/#.U5Chm5RdUZ0">time</a> we went over how to set up a basic Flask structure and then developed a static site, styled with Bootstrap. In this second part of the series, we&rsquo;ll be adding a login page for end users to, well, login to.</p>

<p>Building on the code from the previous tutorial, we need to-</p>

<ul>
<li>Add a route to handle requests to the login URL, and</li>
<li>Add a template for the login page</li>
</ul>


<a name="Add.a.route.to.handle.requests.to.the.login.URL"></a>
<h2>Add a route to handle requests to the login URL</h2>

<p>Make sure your virtualenv is activated. Open <em>app.py</em> in your code editor and add the following route:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># route for handling the login page logic</span>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/login&#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>
</span><span class='line'><span class="k">def</span> <span class="nf">login</span><span class="p">():</span>
</span><span class='line'>    <span class="n">error</span> <span class="o">=</span> <span class="bp">None</span>
</span><span class='line'>    <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="p">:</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s">&#39;username&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;admin&#39;</span> <span class="ow">or</span> <span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s">&#39;password&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;admin&#39;</span><span class="p">:</span>
</span><span class='line'>            <span class="n">error</span> <span class="o">=</span> <span class="s">&#39;Invalid Credentials. Please try again.&#39;</span>
</span><span class='line'>        <span class="k">else</span><span class="p">:</span>
</span><span class='line'>            <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;home&#39;</span><span class="p">))</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;login.html&#39;</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="n">error</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Make sure you also update the imports:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><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">redirect</span><span class="p">,</span> <span class="n">url_for</span><span class="p">,</span> <span class="n">request</span>
</span></code></pre></td></tr></table></div></figure>


<a name="So..what.s.going.on."></a>
<h3>So, what&rsquo;s going on?</h3>

<ol>
<li><p>First, notice that we specified the applicable HTTP methods for the route, GET and POST, as an argument in the route decorator.</p></li>
<li><p>GET is the default method. So, if no methods are explicitly defined, Flask assumes that the only available <a href="http://flask.pocoo.org/docs/quickstart/#http-methods">method</a> is GET, as is the case for the previous two routes, <code>/</code> and <code>/welcome</code>.</p></li>
<li><p>For the new <code>/login</code> route we need to specifiy the POST method as well as GET so that end users can send a POST request with their login credentials to that <code>/login</code> endpoint.</p></li>
<li><p>The logic within the <code>login()</code> function tests to see if the credentials are correct. If they are correct, then the user is redirected to the main route, <code>/</code>, and if the credentials are incorrect, an error populates. Where do these credentials come from? The POST request, which you&rsquo;ll see in just a minute.</p></li>
<li><p>In the case of a GET request, the login page is simply rendered.</p></li>
</ol>


<blockquote><p><strong>NOTE</strong>: The <a href="http://flask.pocoo.org/docs/api/#flask.url_for"><code>url_for()</code></a> function generates an endpoint for the provided method.</p></blockquote>

<a name="Add.a.template.for.the.login.page"></a>
<h2>Add a template for the login page</h2>

<p>Create a new file called <em>login.html</em>, adding it to the &ldquo;templates&rdquo; directory:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>  <span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>Flask Intro - login page<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">name=</span><span class="s">&quot;viewport&quot;</span> <span class="na">content=</span><span class="s">&quot;width=device-width, initial-scale=1.0&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">&quot;static/bootstrap.min.css&quot;</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">media=</span><span class="s">&quot;screen&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;h1&gt;</span>Please login<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>      <span class="nt">&lt;br&gt;</span>
</span><span class='line'>      <span class="nt">&lt;form</span> <span class="na">action=</span><span class="s">&quot;&quot;</span> <span class="na">method=</span><span class="s">&quot;post&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">placeholder=</span><span class="s">&quot;Username&quot;</span> <span class="na">name=</span><span class="s">&quot;username&quot;</span> <span class="na">value=</span><span class="s">&quot;{{</span>
</span><span class='line'><span class="s">          request.form.username }}&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>         <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;password&quot;</span> <span class="na">placeholder=</span><span class="s">&quot;Password&quot;</span> <span class="na">name=</span><span class="s">&quot;password&quot;</span> <span class="na">value=</span><span class="s">&quot;{{</span>
</span><span class='line'><span class="s">          request.form.password }}&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;input</span> <span class="na">class=</span><span class="s">&quot;btn btn-default&quot;</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">value=</span><span class="s">&quot;Login&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/form&gt;</span>
</span><span class='line'>      {% if error %}
</span><span class='line'>        <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">&quot;error&quot;</span><span class="nt">&gt;&lt;strong&gt;</span>Error:<span class="nt">&lt;/strong&gt;</span> {{ error }}
</span><span class='line'>      {% endif %}
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Time for a quick test &hellip;</p>

<ol>
<li><p>Fire up the server. Navigate to <a href="http://localhost:5000/login">http://localhost:5000/login</a>.</p></li>
<li><p>Enter the incorrect credentials, then press login. You should get this response: &ldquo;Error: Invalid Credentials. Please try again.&rdquo;</p></li>
<li><p>Now use &ldquo;admin&rdquo; for both the username and password and you should be redirected to the <code>/</code> URL.</p></li>
<li><p>Can you tell what&rsquo;s happening here? When the form is submitted, a POST request is sent along with the form data, <code>value="{{request.form.username }}"</code> and <code>value="{{request.form.password }}"</code>, to the controller, <code>app.py</code> &ndash; which then handles the request and either responds with an error message or redirects the user to the <code>/</code> URL. <strong>Be sure to check out the accompanying <a href="https://www.youtube.com/watch?v=bLA6eBGN-_0">video</a> to dig deeper into this with Chrome Developer Tools!</strong></p></li>
<li><p>Finally, we have some logic in our templates. Originally, we passed in None for the error. Well, if the error is not None, then we display the actual error message, which gets passed to the template from the views: <code>&lt;p class="error"&gt;&lt;strong&gt;Error:&lt;/strong&gt; {{ error }}&lt;/p&gt;</code>. For info on how this works, check out <a href="http://www.realpython.com/blog/python/primer-on-jinja-templating/#.U5CtZJRdUZ0">this</a> blog post to learn more about the Jinja2 templating engine.</p></li>
</ol>


<a name="Conclusion"></a>
<h2>Conclusion</h2>

<p>What do you think? Simple, right? Don&rsquo;t get too excited yet, as we still have much more to do with reguard to user management &hellip;</p>

<p>Now that users have the ability to login, we need to protect that URL <code>/</code> from unauthorized access. In other words, when an end user hits that endpoint, unless they are already logged in, then they should be immediately sent to the login page. Next time. Until then, go <a href="http://www.realpython.com/learn/jquery-practice/">practice</a> some jQuery.</p>

<p><strong>Be sure to grab the <a href="https://github.com/realpython/flask-intro">code</a> and watch the <a href="https://www.youtube.com/watch?v=bLA6eBGN-_0">video</a>.</strong></p>

<a name="Video"></a>
<h2>Video</h2>

<div class="embed-video-container"><iframe src="https://www.youtube.com/embed/bLA6eBGN-_0" allowfullscreen style="width: 420px; height: 345px;"></iframe></div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Discover Flask, Part 1 - Setting up a static site]]></title>
    <link href="https://realpython.com/blog/python/introduction-to-flask-part-1-setting-up-a-static-site/"/>
    <updated>2014-06-04T12:22:03-07:00</updated>
    <id>https://realpython.com/blog/python/introduction-to-flask-part-1-setting-up-a-static-site</id>
    <content type="html"><![CDATA[<p>Welcome to the Discover Flask series &hellip;</p>

<p><a href="http://discoverflask.com">http://discoverflask.com</a></p>

<a name="Series.Overview"></a>
<h3>Series Overview</h3>

<table style="font-size: 18px;border-spacing: 10px 0px;border-collapse: separate;">
    <thead>
        <tr>
            <th>Part</th>
            <th>Title</th>
            <th>Tutorial</th>
            <th>Video</th>
        </tr>
    </thead>
    <tbody>
        <tr><td>1</td>
        <td>Setting Up a Static Site</td>
        <td> <a href="http://www.realpython.com/blog/python/introduction-to-flask-part-1-setting-up-a-static-site">Link</a>
        </td>
        <td> <a href="http://youtu.be/WfpFUmV1d0w">Link</a>

        </td>
        </tr>
        <tr>
            <td>2</td>
            <td>Creating a Login Page</td>
            <td> <a href="http://www.realpython.com/blog/python/introduction-to-flask-part-2-creating-a-login-page">Link</a>
            </td>
            <td> <a href="http://youtu.be/bLA6eBGN-_0">Link</a>

            </td>
        </tr>
        <tr>
            <td>3</td>
            <td>User Authentication</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/BnBjhmspw4c">Link</a>

            </td>
        </tr>
        <tr>
            <td>4</td>
            <td>Template Inheritance</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/hNzruwVPtCE">Link</a>

            </td>
        </tr>
        <tr>
            <td>5</td>
            <td>Databases</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/_vrAjAHhUsA">Link</a>

            </td>
        </tr>
        <tr>
            <td>6</td>
            <td>List Comprehensions</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/WqmqNC8Teeo">Link</a>

            </td>
        </tr>
        <tr>
            <td>7</td>
            <td>Unit Tests</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/1aHNs1aEATg">Link</a>

            </td>
        </tr>
        <tr>
            <td>8</td>
            <td>Deploying to Heroku</td>
            <td>N/A</td>
            <td> <a href="https://www.youtube.com/watch?v=L9uD74nHvFY">Link</a>

            </td>
        </tr>
        <tr>
            <td>9</td>
            <td>SQLAlchemy</td>
            <td>N/A</td>
            <td> <a href="https://www.youtube.com/watch?v=kuyrL6krkwA">Link</a>

            </td>
        </tr>
        <tr>
            <td>10</td>
            <td>Configuration</td>
            <td>N/A</td>
            <td> <a href="https://www.youtube.com/watch?v=4Eww3wVZK2I">Link</a>

            </td>
        </tr>
        <tr>
            <td>11</td>
            <td>Secret Key</td>
            <td>N/A</td>
            <td> <a href="https://www.youtube.com/watch?v=tqu9y4iqKVI">Link</a>

            </td>
        </tr>
        <tr>
            <td>12</td>
            <td>Heroku Configuration Settings</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/Y-ONxFkAUJc">Link</a>
            </td>
        </tr>

        <tr>
            <td>13</td>
            <td>Heroku PostgreSQL Setup</td>
            <td>N/A</td>
            <td> <a href="https://www.youtube.com/watch?v=FD0p-opdyoE">Link</a>
            </td>
        </tr>

        <tr>
            <td>14</td>
            <td>Local PostgreSQL Setup</td>
            <td>N/A</td>
            <td> <a href="https://www.youtube.com/watch?v=Up3p20rgWCw">Link</a>
            </td>
        </tr>

        <tr>
            <td>15</td>
            <td>Managing Database Migrations</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/YJibNSI-iaE">Link</a>
            </td>
        </tr>

        <tr>
            <td>16</td>
            <td>Database Downgrades with Flask-Migrate/Alembic</td>
            <td>N/A</td>
            <td> <a href="http://youtu.be/5UT1binVuYc">Link</a>
            </td>
        </tr>

    </tbody>
</table>




<hr>


<p><a href="http://flask.pocoo.org/">Flask</a> is a micro web framework powered by Python. It&rsquo;s API is fairly small, making it easy to learn and simple to use. But don&rsquo;t let this fool you, as it&rsquo;s powerful enough to support enterprise-level applications handling large amounts of traffic. You can start small with an app contained entirely in one file, then slowly scale up to multiple files and folders in a well-structured manner as your site becomes more and more complex.</p>

<p>It&rsquo;s an excellent framework to start with, which you&rsquo;ll be learning in true &ldquo;Real Python-style&rdquo;: with hands-on, practical examples that are interesting and fun.</p>

<blockquote><p><strong>Note</strong>: This tutorial was original posted on 01/29/2013. We revamped it and due to the number of changes made, it was decided to &ldquo;retire&rdquo; the old tutorial and create an entirely new one. If you are interested in viewing the code and video for the old tutorial, please visit this <a href="https://github.com/mjhea0/flask-intro">repo</a>.</p></blockquote>

<p><strong>Check out the accompanying <a href="https://www.youtube.com/watch?v=WfpFUmV1d0w">video</a>.</strong></p>

<a name="Requirements"></a>
<h2>Requirements</h2>

<p>This tutorial assumes you have <a href="https://www.python.org/download/releases/2.7">Python 2.7.x</a>, <a href="http://pip.readthedocs.org/en/latest/installing.html">pip</a>, and <a href="http://virtualenv.readthedocs.org/en/latest/">virtualenv</a> installed.</p>

<p>Ideally, you should have basic knowledge of the command line or terminal and Python in general. If not, you will learn enough to get by, then as you continue working with Flask, your development skills will advanced as well. If you do want additional help, check out the <a href="http://www.realpython.com">Real Python</a> series to learn Python and web development from the ground up.</p>

<p>You also need a code editor or IDE such as <a href="http://www.sublimetext.com/">Sublime Text</a>, <a href="https://wiki.gnome.org/Apps/Gedit">gedit</a>, <a href="http://notepad-plus-plus.org/">Notepad++</a>, or <a href="http://vimdoc.sourceforge.net/">VIM</a>, etc. If you&rsquo;re ensure what to use, check out Sublime Text, which is a lightweight, yet powerful cross-platform code editor.</p>

<a name="Conventions"></a>
<h2>Conventions</h2>

<ol>
<li><p>All examples in this tutorial utilize a Unix-style prompt: <code>$ python hello-world.py</code>. <em>Remember that the dollar sign is not part of the command, and the equivalent command in Windows is: <code>C:\Sites&gt; python hello-world.py</code>.</em></p></li>
<li><p>All examples are coded in Sublime Text 3.</p></li>
<li><p>All examples utilize Python 2.7.7. You can use any version of 2.7.x, though.</p></li>
<li><p>Additional requirements and dependency versions are listed in the <em>requirements.txt</em> file found within the Github <a href="https://github.com/realpython/flask-intro">repo</a>.</p></li>
</ol>


<a name="Setup"></a>
<h2>Setup</h2>

<ol>
<li>Navigate to a convenient directory, such as the &ldquo;Desktop&rdquo; or &ldquo;Documents&rdquo; folder</li>
<li>Create a new directory called &ldquo;flask-intro&rdquo; to house your project</li>
<li>Activate a virtualenv</li>
<li>Install Flask with Pip <code>$ pip install Flask</code></li>
</ol>


<a name="Structure"></a>
<h2>Structure</h2>

<p>If you&rsquo;re familiar with <a href="https://www.djangoproject.com/">Django</a>, <a href="http://www.web2py.com/">web2py</a>, or any other high-level (or <a href="https://wiki.python.org/moin/WebFrameworks">full-stack</a>) framework, then you know that each impose a specific structure. Due to it&rsquo;s minimalist nature, however, Flask does not provide a set structure, which can be difficult for beginners. Fortunately, it&rsquo;s fairly easy to figure out, especially if you use a single file for the Flask components.</p>

<p>Create the following project structure within the &ldquo;flask-intro&rdquo; folder:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>.
</span><span class='line'>├── app.py
</span><span class='line'>├── static
</span><span class='line'>└── templates</span></code></pre></td></tr></table></div></figure>


<p>Here, we simply have a single file for our Flask app called <em>app.py</em> and then two folders, &ldquo;static&rdquo; and &ldquo;templates&rdquo;. The former houses our stylesheets, Javascript files, and images, while the latter is for HTML files. This is a good base to start with. We&rsquo;re already thinking in terms of front vs. back-end. The <em>app.py</em> will utilize the Model-View-Controller (MVC) design pattern in the back-end to handle requests and dish out responses to the end user.</p>

<p>Put simply, when a request comes in, the controller, which handles our app&rsquo;s business logic, decides how to handle it.</p>

<p>For example, the controller could communicate directly with a database (like MySQL, SQLite, PostgreSQL, MongoDB, etc.) to obtain the requested data and return a response, via the views, with the appropriate data in the appropriate format (like HTML or JSON). Or perhaps the end user&rsquo;s request is for a resource that does not exist &ndash; in which case the controller will respond with a 404 error.</p>

<p>Starting with this structure will help with scaling your app out into separate files and folders, since there&rsquo;s already a logical separation between the front and back-end. If you&rsquo;re unfamiliar with the MVC pattern, read more about it <a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller">here</a>. Get used to it as almost every web framework utilizes some form of MVC.</p>

<a name="Routes"></a>
<h2>Routes</h2>

<p>Open your favorite editor and add the following code to your <em>app.py</em> file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># import the Flask class from the flask module</span>
</span><span class='line'><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><span class='line'>
</span><span class='line'><span class="c"># create the application object</span>
</span><span class='line'><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><span class='line'>
</span><span class='line'><span class="c"># use decorators to link the function to a url</span>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">home</span><span class="p">():</span>
</span><span class='line'>    <span class="k">return</span> <span class="s">&quot;Hello, World!&quot;</span>  <span class="c"># return a string</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/welcome&#39;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">welcome</span><span class="p">():</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;welcome.html&#39;</span><span class="p">)</span>  <span class="c"># render a template</span>
</span><span class='line'>
</span><span class='line'><span class="c"># start the server with the &#39;run()&#39; method</span>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">debug</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is fairly straightforward.</p>

<p>After importing the <code>Flask</code> class, we create (or instantiate) the application object, define the views to respond to requests, then start the server.</p>

<p>The <code>route</code> <a href="http://flask.pocoo.org/docs/patterns/viewdecorators/">decorators</a> are used to associate (or map) a URL to a function. The URL <code>/</code> is associated with the <code>home()</code> function, so when the end user requests that URL, the view will respond with a string. Similarly, when the <code>/welcome</code> URL is requested, the view will render the <em>welcome.html</em> template.</p>

<p><strong>In short, the main application object is instantiated which is then used to map URLs to functions.</strong></p>

<p>For a more detailed explanation, read Flask’s quick-start <a href="http://flask.pocoo.org/docs/quickstart/">tutorial</a>.</p>

<a name="Test"></a>
<h2>Test</h2>

<p>Time for a sanity check. Fire up your development server:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python app.py
</span></code></pre></td></tr></table></div></figure>


<p>Navigate to <a href="http://localhost:5000/">http://localhost:5000/</a>. You should see &ldquo;Hello, World!&rdquo; staring back at you. Then request the next URL, <a href="http://localhost:5000/welcome">http://localhost:5000/welcome</a>. You should see, a &ldquo;TemplateNotFound&rdquo; error. Why? Because we have not set up our template, <em>welcome.html</em>. Flask is looking for it, but it&rsquo;s not there. Let&rsquo;s do that. First, kill the server by pressing CTRL+C from your terminal.</p>

<blockquote><p>For more on the actual response, check out the <a href="https://www.youtube.com/watch?v=WfpFUmV1d0w">video</a> accompanying this post.</p></blockquote>

<a name="Templates"></a>
<h2>Templates</h2>

<p>Create a new file in your templates directory called <em>welcome.html</em>. Open this file in your code editor, then add the following HTML:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>  <span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>Flask Intro<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">name=</span><span class="s">&quot;viewport&quot;</span> <span class="na">content=</span><span class="s">&quot;width=device-width, initial-scale=1.0&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;h1&gt;</span>Welcome to Flask!<span class="nt">&lt;/h2&gt;</span>
</span><span class='line'>      <span class="nt">&lt;br&gt;</span>
</span><span class='line'>      <span class="nt">&lt;p&gt;</span>Click <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">&quot;/&quot;</span><span class="nt">&gt;</span>here<span class="nt">&lt;/a&gt;</span> to go home.<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Save. Run your server again. What do you see now when you request <a href="http://localhost:5000/welcome">http://localhost:5000/welcome</a>? Test the link. It works but it&rsquo;s not very pretty. Let&rsquo;s change that. This time leave the server running as we make the changes.</p>

<a name="Bootstrap"></a>
<h2>Bootstrap</h2>

<p>Okay. Let&rsquo;s utilize those static folders by adding a stylesheet. Have you heard of Bootstrap? If your answer is no, then check out <a href="http://www.realpython.com/blog/design/getting-started-with-bootstrap-3/">this</a> blog post for details.</p>

<p>Download <a href="http://getbootstrap.com/">Bootstrap</a>, then add the <em>bootstrap.min.css</em> and <em>bootstrap.min.js</em> files to your &ldquo;static&rdquo; folder.</p>

<p>Update the template:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>  <span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>Flask Intro<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">name=</span><span class="s">&quot;viewport&quot;</span> <span class="na">content=</span><span class="s">&quot;width=device-width, initial-scale=1.0&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">&quot;static/bootstrap.min.css&quot;</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">media=</span><span class="s">&quot;screen&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;h1&gt;</span>Welcome to Flask!<span class="nt">&lt;/h2&gt;</span>
</span><span class='line'>      <span class="nt">&lt;br&gt;</span>
</span><span class='line'>      <span class="nt">&lt;p&gt;</span>Click <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">&quot;/&quot;</span><span class="nt">&gt;</span>here<span class="nt">&lt;/a&gt;</span> to go home.<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>We just included the CSS stylesheet; we&rsquo;ll add the Javascript file in a latter tutorial.</p>

<p>Return to your browser.</p>

<p>Remember that we left the server running? Well, when Flask is in <a href="http://flask.pocoo.org/docs/quickstart/#debug-mode">debug mode</a>, <code>app.run(debug=True)</code>, there&rsquo;s an auto-reload mechanism that kicks in on code changes. Thus, we can just press refresh in our browser and we should see the new template staring right back at us.</p>

<p>Nice.</p>

<a name="Conclusion"></a>
<h2>Conclusion</h2>

<p>What are your initial thoughts? Comment below. Grab the <a href="https://github.com/realpython/flask-intro">code</a>. Watch the <a href="https://www.youtube.com/watch?v=WfpFUmV1d0w">video</a>.</p>

<p>In under thirty minutes, you learned the Flask basics and set the ground work for a larger app. If you&rsquo;ve worked with Django before, you probably noticed immediately that Flask stays out of your way as you develop, leaving you free to structure and design your app how you see fit. Because of the lack of structure, true beginners may struggle a bit, however it&rsquo;s an invaluable learning experience that will benefit you in the long run, regardless of whether you continue working with Flask or move on to a higher-level framework.</p>

<p>In the next tutorial we&rsquo;ll look at adding some dynamic content.</p>

<p>Cheers!</p>

<a name="Video"></a>
<h2>Video</h2>

<div class="embed-video-container"><iframe src="https://www.youtube.com/embed/WfpFUmV1d0w" allowfullscreen style="width: 420px; height: 345px;"></iframe></div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Python Interview Problem - Parsing CSV Files]]></title>
    <link href="https://realpython.com/blog/python/python-interview-problem-parsing-csv-files/"/>
    <updated>2014-05-31T11:55:32-07:00</updated>
    <id>https://realpython.com/blog/python/python-interview-problem-parsing-csv-files</id>
    <content type="html"><![CDATA[<p>So, a friend of mine recently interviewed for a back-end Python developer position, and the initial interview consisted of answering the following problem. He was given two hours.</p>

<a name="Problem"></a>
<h2>Problem</h2>

<ol>
<li><strong>Football</strong>: The <em>football.csv</em> file contains the results from the English Premier League. The columns labeled ‘Goals’ and ‘Goals Allowed’ contain the total number of goals scored for and against each team in that season (so Arsenal scored 79 goals against opponents, and had 36 goals scored against them). Write a program to read the file, then print the name of the team with the smallest difference in ‘for’ and ‘against’ goals.</li>
<li><strong>Weather</strong>: In <em>weather.csv</em> you’ll find daily weather data. Write a program to read the file, then output the day number (column one) with the smallest temperature spread (the maximum temperature is the second column, the minimum the third column).</li>
<li>See if you can write the same program to solve both questions.</li>
<li>Test Driven Development!</li>
</ol>


<p>You can grab all the files <a href="https://github.com/realpython/interview-questions/tree/master/parsing-data">here</a>.</p>

<p><em>Try this on your own before you look at my answer below.</em></p>

<blockquote><p><strong>Note:</strong> I have not solved this problem before, so I will be going through a number of iterations. Hopefully, this will give you insight into the process/workflow I went through. Once finished, compare your workflow with mine. What did you do differently? Finally, I will be using a true TDD approach for this. In other words, after I write a test, I will only write the bare minimum amount of code to get it to pass. That said, there will most likely be plenty of refactoring throughout. Bare with me. Patience.</p></blockquote>

<a name="Part.1:.Football"></a>
<h2>Part 1: Football</h2>

<a name="Write.your.tests"></a>
<h3>Write your tests</h3>

<p>In true TDD style, we start by writing our tests that will fail. Since we must first read in the CSV data, let&rsquo;s ensure that we can do that, by testing that the data read in is what we think it should be.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">unittest</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">parse_csv</span> <span class="kn">import</span> <span class="n">read_data</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">ParseCSVTest</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;football.csv&#39;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_data_headers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span>
</span><span class='line'>            <span class="n">read_data</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>            <span class="p">[</span><span class="s">&#39;Team&#39;</span><span class="p">,</span> <span class="s">&#39;Games&#39;</span><span class="p">,</span> <span class="s">&#39;Wins&#39;</span><span class="p">,</span> <span class="s">&#39;Losses&#39;</span><span class="p">,</span> <span class="s">&#39;Draws&#39;</span><span class="p">,</span> <span class="s">&#39;Goals&#39;</span><span class="p">,</span> <span class="s">&#39;Goals Allowed&#39;</span><span class="p">,</span> <span class="s">&#39;Points&#39;</span><span class="p">]</span>
</span><span class='line'>            <span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_data_team_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">read_data</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="s">&#39;Arsenal&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_data_points</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">read_data</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)[</span><span class="mi">1</span><span class="p">][</span><span class="mi">7</span><span class="p">],</span> <span class="s">&#39;87&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here, we are using a function imported from <em>parse_csv.py</em> called <code>read_data()</code>, which we haven&rsquo;t written yet, to read in the data. Then we have three unit tests to check the values of the data read in.</p>

<p>Run your tests:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python parse_csv_test.py
</span><span class='line'>Traceback <span class="o">(</span>most recent call last<span class="o">)</span>:
</span><span class='line'>  File <span class="s2">&quot;parse_csv_test.py&quot;</span>, line 2, in &lt;module&gt;
</span><span class='line'>    from parse_csv import read_data
</span><span class='line'>ImportError: cannot import name read_data
</span></code></pre></td></tr></table></div></figure>


<a name="Write.the..code.read_data....code..function"></a>
<h3>Write the <code>read_data()</code> function</h3>

<p>Next, let&rsquo;s write <em>just enough</em> code in <em>parse_csv.py</em> to get our tests to pass.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">csv</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">read_data</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
</span><span class='line'>    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span class='line'>        <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">row</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">csv</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">())]</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">data</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="c"># ---- run code ---- #</span>
</span><span class='line'>
</span><span class='line'><span class="n">data</span> <span class="o">=</span> <span class="s">&quot;football.csv&quot;</span>
</span><span class='line'><span class="n">read_data</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Run the tests again:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python parse_csv_test.py -v
</span><span class='line'>test_csv_read_data_headers <span class="o">(</span>__main__.ParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>test_csv_read_data_points <span class="o">(</span>__main__.ParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>test_csv_read_data_team_name <span class="o">(</span>__main__.ParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>
</span><span class='line'>----------------------------------------------------------------------
</span><span class='line'>Ran 3 tests in 0.001s
</span><span class='line'>
</span><span class='line'>OK
</span></code></pre></td></tr></table></div></figure>


<a name="Test.Redux"></a>
<h3>Test Redux</h3>

<p>Back to the test file. This time, we want to find the &ldquo;smallest difference in ‘for’ and ‘against’ goals&rdquo;. So, add this import and function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">parse_csv</span> <span class="kn">import</span> <span class="n">read_data</span><span class="p">,</span> <span class="n">get_min_score_difference</span>
</span><span class='line'>
</span><span class='line'><span class="o">...</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">test_get_min_score_difference</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">get_min_score_difference</span><span class="p">(</span><span class="n">parsed_data</span><span class="p">),</span> <span class="s">&quot;no idea&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Since, we don&rsquo;t know off hand what the smallest difference will be, we can just add the string &ldquo;no idea&rdquo;. You could update that when you know what the answer is after we add the <code>get_min_score_difference()</code> function to <em>parse_csv.py</em> &ndash; but how do we know if that answer is correct?</p>

<p>Keep in mind, that since this is a small amount of data, you can get away with calculating them all by hand and finding the smallest difference. Or you could also use test data.:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">test_get_min_score_difference</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="n">parsed_data</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>        <span class="p">[</span><span class="s">&#39;Team&#39;</span><span class="p">,</span> <span class="s">&#39;Games&#39;</span><span class="p">,</span> <span class="s">&#39;Wins&#39;</span><span class="p">,</span> <span class="s">&#39;Losses&#39;</span><span class="p">,</span> <span class="s">&#39;Draws&#39;</span><span class="p">,</span> <span class="s">&#39;Goals&#39;</span><span class="p">,</span> <span class="s">&#39;Goals Allowed&#39;</span><span class="p">,</span> <span class="s">&#39;Points&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="p">[</span><span class="s">&#39;Arsenal&#39;</span><span class="p">,</span> <span class="s">&#39;38&#39;</span><span class="p">,</span> <span class="s">&#39;26&#39;</span><span class="p">,</span> <span class="s">&#39;9&#39;</span><span class="p">,</span> <span class="s">&#39;3&#39;</span><span class="p">,</span> <span class="s">&#39;79&#39;</span><span class="p">,</span> <span class="s">&#39;36&#39;</span><span class="p">,</span> <span class="s">&#39;87&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="p">[</span><span class="s">&#39;Liverpool&#39;</span><span class="p">,</span> <span class="s">&#39;38&#39;</span><span class="p">,</span> <span class="s">&#39;24&#39;</span><span class="p">,</span> <span class="s">&#39;8&#39;</span><span class="p">,</span> <span class="s">&#39;6&#39;</span><span class="p">,</span> <span class="s">&#39;67&#39;</span><span class="p">,</span> <span class="s">&#39;30&#39;</span><span class="p">,</span> <span class="s">&#39;80&#39;</span><span class="p">]</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">get_min_score_difference</span><span class="p">(</span><span class="n">parsed_data</span><span class="p">),</span> <span class="s">&#39;37&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s go with the latter, since we <em>know</em> this is correct.</p>

<p>Run the test. Watch it fail.</p>

<a name="Write.the..code.get_min_score_difference....code..function"></a>
<h3>Write the <code>get_min_score_difference()</code> function</h3>

<p>To simplify this, let&rsquo;s use list comprehensions:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">get_min_score_difference</span><span class="p">(</span><span class="n">parsed_data</span><span class="p">):</span>
</span><span class='line'>    <span class="n">parsed_data</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span><span class='line'>    <span class="n">goals</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">]</span>
</span><span class='line'>    <span class="n">goals_allowed</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">]</span>
</span><span class='line'>    <span class="k">return</span> <span class="nb">min</span><span class="p">([</span><span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="nb">float</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">goals</span><span class="p">,</span> <span class="n">goals_allowed</span><span class="p">)])</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, what&rsquo;s going on:</p>

<ol>
<li>First, we removed the header row since it will just get in the way.</li>
<li>Next, we created two new lists &ndash; one containing the goals score, the other containing the goals allowed</li>
<li>Finally, we simply created another new list containing the values from the first two lists subtracted, then we returned the smallest value.</li>
</ol>


<p>Test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python parse_csv_test.py -v
</span><span class='line'>test_csv_read_data_headers <span class="o">(</span>__main__.ParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>test_csv_read_data_points <span class="o">(</span>__main__.ParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>test_csv_read_data_team_name <span class="o">(</span>__main__.ParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>test_get_min_score_difference <span class="o">(</span>__main__.ParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>
</span><span class='line'>----------------------------------------------------------------------
</span><span class='line'>Ran 4 tests in 0.000s
</span><span class='line'>
</span><span class='line'>OK
</span></code></pre></td></tr></table></div></figure>


<p>They pass. But remember &ndash; There is another step to the TDD process: Refactoring. (<em>Hint, hint</em>).</p>

<p>Ask yourself: Since we eventually want the name of the team with the smallest spread, does it help to get the minimum value? No. It would be much easier to find the minimum value and then return the index value so that we can plug that in to the next function to easily get the name of the team.</p>

<p>First, rewrite the test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">test_get_min_score_difference</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="n">data</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>        <span class="p">[</span><span class="s">&#39;Team&#39;</span><span class="p">,</span> <span class="s">&#39;Games&#39;</span><span class="p">,</span> <span class="s">&#39;Wins&#39;</span><span class="p">,</span> <span class="s">&#39;Losses&#39;</span><span class="p">,</span> <span class="s">&#39;Draws&#39;</span><span class="p">,</span> <span class="s">&#39;Goals&#39;</span><span class="p">,</span> <span class="s">&#39;Goals Allowed&#39;</span><span class="p">,</span> <span class="s">&#39;Points&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="p">[</span><span class="s">&#39;Arsenal&#39;</span><span class="p">,</span> <span class="s">&#39;38&#39;</span><span class="p">,</span> <span class="s">&#39;26&#39;</span><span class="p">,</span> <span class="s">&#39;9&#39;</span><span class="p">,</span> <span class="s">&#39;3&#39;</span><span class="p">,</span> <span class="s">&#39;79&#39;</span><span class="p">,</span> <span class="s">&#39;36&#39;</span><span class="p">,</span> <span class="s">&#39;87&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="p">[</span><span class="s">&#39;Liverpool&#39;</span><span class="p">,</span> <span class="s">&#39;38&#39;</span><span class="p">,</span> <span class="s">&#39;24&#39;</span><span class="p">,</span> <span class="s">&#39;8&#39;</span><span class="p">,</span> <span class="s">&#39;6&#39;</span><span class="p">,</span> <span class="s">&#39;67&#39;</span><span class="p">,</span> <span class="s">&#39;30&#39;</span><span class="p">,</span> <span class="s">&#39;80&#39;</span><span class="p">]</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">get_min_score_difference</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, let&rsquo;s get it to pass:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">get_min_score_difference</span><span class="p">(</span><span class="n">parsed_data</span><span class="p">):</span>
</span><span class='line'>    <span class="n">parsed_data</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span><span class='line'>    <span class="n">goals</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">]</span>
</span><span class='line'>    <span class="n">goals_allowed</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">]</span>
</span><span class='line'>    <span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="nb">float</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">goals</span><span class="p">,</span> <span class="n">goals_allowed</span><span class="p">)]</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">values</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">values</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Test again.</p>

<blockquote><p>If you&rsquo;re having trouble following the list comprehensions, try rewriting them using the regular list construct. For example:
  &#8220;`python</p>

<pre><code>for x in parsed_data:
    goals.append(x[5])
```
</code></pre></blockquote>

<a name="Final.Test"></a>
<h3>Final Test</h3>

<p>Again, let&rsquo;s test to see which team has the smallest range between goals scored and goals allowed:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">test_get_team</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="n">data</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>        <span class="p">[</span><span class="s">&#39;Team&#39;</span><span class="p">,</span> <span class="s">&#39;Games&#39;</span><span class="p">,</span> <span class="s">&#39;Wins&#39;</span><span class="p">,</span> <span class="s">&#39;Losses&#39;</span><span class="p">,</span> <span class="s">&#39;Draws&#39;</span><span class="p">,</span> <span class="s">&#39;Goals&#39;</span><span class="p">,</span> <span class="s">&#39;Goals Allowed&#39;</span><span class="p">,</span> <span class="s">&#39;Points&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="p">[</span><span class="s">&#39;Arsenal&#39;</span><span class="p">,</span> <span class="s">&#39;38&#39;</span><span class="p">,</span> <span class="s">&#39;26&#39;</span><span class="p">,</span> <span class="s">&#39;9&#39;</span><span class="p">,</span> <span class="s">&#39;3&#39;</span><span class="p">,</span> <span class="s">&#39;79&#39;</span><span class="p">,</span> <span class="s">&#39;36&#39;</span><span class="p">,</span> <span class="s">&#39;87&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="p">[</span><span class="s">&#39;Liverpool&#39;</span><span class="p">,</span> <span class="s">&#39;38&#39;</span><span class="p">,</span> <span class="s">&#39;24&#39;</span><span class="p">,</span> <span class="s">&#39;8&#39;</span><span class="p">,</span> <span class="s">&#39;6&#39;</span><span class="p">,</span> <span class="s">&#39;67&#39;</span><span class="p">,</span> <span class="s">&#39;30&#39;</span><span class="p">,</span> <span class="s">&#39;80&#39;</span><span class="p">]</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'>    <span class="n">index_value</span> <span class="o">=</span> <span class="n">get_min_score_difference</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">get_team</span><span class="p">(</span><span class="n">index_value</span><span class="p">),</span> <span class="s">&#39;Liverpool&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Make sure to import in the <code>get_team</code> function. Run the tests file. This will fail. Success!</p>

<a name="Write.the..code.get_team....code..function"></a>
<h3>Write the <code>get_team()</code> function</h3>

<p>Simply use that index value from the previous function as an argument, then create a list of all the teams, and finally pass in that index value to that list of teams:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">get_team</span><span class="p">(</span><span class="n">index_value</span><span class="p">,</span> <span class="n">parsed_data</span><span class="p">):</span>
</span><span class='line'>    <span class="n">teams</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">]</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">teams</span><span class="p">[</span><span class="n">index_value</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Tests pass.</p>

<a name="Refactor.Tests"></a>
<h3>Refactor Tests</h3>

<p>In our tests, let&rsquo;s move our parsed data to the <code>setUp</code> so that we&rsquo;re not repeating ourselves:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">unittest</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">parse_csv</span> <span class="kn">import</span> <span class="n">read_data</span><span class="p">,</span> <span class="n">get_min_score_difference</span><span class="p">,</span> <span class="n">get_team</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">ParseCSVTest</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;football.csv&#39;</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">parsed_data</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>            <span class="p">[</span><span class="s">&#39;Team&#39;</span><span class="p">,</span> <span class="s">&#39;Games&#39;</span><span class="p">,</span> <span class="s">&#39;Wins&#39;</span><span class="p">,</span> <span class="s">&#39;Losses&#39;</span><span class="p">,</span> <span class="s">&#39;Draws&#39;</span><span class="p">,</span> <span class="s">&#39;Goals&#39;</span><span class="p">,</span> <span class="s">&#39;Goals Allowed&#39;</span><span class="p">,</span> <span class="s">&#39;Points&#39;</span><span class="p">],</span>
</span><span class='line'>            <span class="p">[</span><span class="s">&#39;Arsenal&#39;</span><span class="p">,</span> <span class="s">&#39;38&#39;</span><span class="p">,</span> <span class="s">&#39;26&#39;</span><span class="p">,</span> <span class="s">&#39;9&#39;</span><span class="p">,</span> <span class="s">&#39;3&#39;</span><span class="p">,</span> <span class="s">&#39;79&#39;</span><span class="p">,</span> <span class="s">&#39;36&#39;</span><span class="p">,</span> <span class="s">&#39;87&#39;</span><span class="p">],</span>
</span><span class='line'>            <span class="p">[</span><span class="s">&#39;Liverpool&#39;</span><span class="p">,</span> <span class="s">&#39;38&#39;</span><span class="p">,</span> <span class="s">&#39;24&#39;</span><span class="p">,</span> <span class="s">&#39;8&#39;</span><span class="p">,</span> <span class="s">&#39;6&#39;</span><span class="p">,</span> <span class="s">&#39;67&#39;</span><span class="p">,</span> <span class="s">&#39;30&#39;</span><span class="p">,</span> <span class="s">&#39;80&#39;</span><span class="p">]</span>
</span><span class='line'>        <span class="p">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_data_headers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span>
</span><span class='line'>            <span class="n">read_data</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>            <span class="p">[</span><span class="s">&#39;Team&#39;</span><span class="p">,</span> <span class="s">&#39;Games&#39;</span><span class="p">,</span> <span class="s">&#39;Wins&#39;</span><span class="p">,</span> <span class="s">&#39;Losses&#39;</span><span class="p">,</span> <span class="s">&#39;Draws&#39;</span><span class="p">,</span> <span class="s">&#39;Goals&#39;</span><span class="p">,</span> <span class="s">&#39;Goals Allowed&#39;</span><span class="p">,</span> <span class="s">&#39;Points&#39;</span><span class="p">]</span>
</span><span class='line'>            <span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_data_team_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">read_data</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="s">&#39;Arsenal&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_data_points</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">read_data</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)[</span><span class="mi">1</span><span class="p">][</span><span class="mi">7</span><span class="p">],</span> <span class="s">&#39;87&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_get_min_score_difference</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">get_min_score_difference</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parsed_data</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_get_team</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">index_value</span> <span class="o">=</span> <span class="n">get_min_score_difference</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parsed_data</span><span class="p">)</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">get_team</span><span class="p">(</span><span class="n">index_value</span><span class="p">),</span> <span class="s">&#39;Liverpool&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<a name="Refactor.Code"></a>
<h3>Refactor Code</h3>

<p>So, per the instructions, we need to make this code work for both CSV files. Let&rsquo;s refactor our code from using a procedural structure or an OOP structure, meant for code reuse:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">csv</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">ParseCSV</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">data</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">read_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span><span class='line'>            <span class="n">parsed_data</span> <span class="o">=</span> <span class="p">[</span><span class="n">row</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">csv</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">())]</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">parsed_data</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">get_min_score_difference</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parsed_data</span><span class="p">):</span>
</span><span class='line'>        <span class="n">parsed_data</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span><span class='line'>        <span class="n">goals</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">]</span>
</span><span class='line'>        <span class="n">goals_allowed</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">]</span>
</span><span class='line'>        <span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="nb">float</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">goals</span><span class="p">,</span> <span class="n">goals_allowed</span><span class="p">)]</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">values</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">values</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">get_team</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index_value</span><span class="p">,</span> <span class="n">parsed_data</span><span class="p">):</span>
</span><span class='line'>        <span class="n">teams</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">]</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">teams</span><span class="p">[</span><span class="n">index_value</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Try running the tests; they will fail:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python parse_csv_test.py
</span><span class='line'>Traceback <span class="o">(</span>most recent call last<span class="o">)</span>:
</span><span class='line'>  File <span class="s2">&quot;parse_csv_test.py&quot;</span>, line 2, in &lt;module&gt;
</span><span class='line'>    from parse_csv import read_data, get_min_score_difference, get_team
</span><span class='line'>ImportError: cannot import name read_data
</span></code></pre></td></tr></table></div></figure>


<a name="Refactor.Tests.Redux"></a>
<h3>Refactor Tests Redux</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">unittest</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">parse_csv</span> <span class="kn">import</span> <span class="n">ParseCSV</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">ParseCSVTest</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;football.csv&#39;</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">parsed_data</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>            <span class="p">[</span><span class="s">&#39;Team&#39;</span><span class="p">,</span> <span class="s">&#39;Games&#39;</span><span class="p">,</span> <span class="s">&#39;Wins&#39;</span><span class="p">,</span> <span class="s">&#39;Losses&#39;</span><span class="p">,</span> <span class="s">&#39;Draws&#39;</span><span class="p">,</span> <span class="s">&#39;Goals&#39;</span><span class="p">,</span> <span class="s">&#39;Goals Allowed&#39;</span><span class="p">,</span> <span class="s">&#39;Points&#39;</span><span class="p">],</span>
</span><span class='line'>            <span class="p">[</span><span class="s">&#39;Arsenal&#39;</span><span class="p">,</span> <span class="s">&#39;38&#39;</span><span class="p">,</span> <span class="s">&#39;26&#39;</span><span class="p">,</span> <span class="s">&#39;9&#39;</span><span class="p">,</span> <span class="s">&#39;3&#39;</span><span class="p">,</span> <span class="s">&#39;79&#39;</span><span class="p">,</span> <span class="s">&#39;36&#39;</span><span class="p">,</span> <span class="s">&#39;87&#39;</span><span class="p">],</span>
</span><span class='line'>            <span class="p">[</span><span class="s">&#39;Liverpool&#39;</span><span class="p">,</span> <span class="s">&#39;38&#39;</span><span class="p">,</span> <span class="s">&#39;24&#39;</span><span class="p">,</span> <span class="s">&#39;8&#39;</span><span class="p">,</span> <span class="s">&#39;6&#39;</span><span class="p">,</span> <span class="s">&#39;67&#39;</span><span class="p">,</span> <span class="s">&#39;30&#39;</span><span class="p">,</span> <span class="s">&#39;80&#39;</span><span class="p">]</span>
</span><span class='line'>        <span class="p">]</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">football</span> <span class="o">=</span> <span class="n">ParseCSV</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_data_headers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span>
</span><span class='line'>            <span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>            <span class="p">[</span><span class="s">&#39;Team&#39;</span><span class="p">,</span> <span class="s">&#39;Games&#39;</span><span class="p">,</span> <span class="s">&#39;Wins&#39;</span><span class="p">,</span> <span class="s">&#39;Losses&#39;</span><span class="p">,</span> <span class="s">&#39;Draws&#39;</span><span class="p">,</span> <span class="s">&#39;Goals&#39;</span><span class="p">,</span> <span class="s">&#39;Goals Allowed&#39;</span><span class="p">,</span> <span class="s">&#39;Points&#39;</span><span class="p">]</span>
</span><span class='line'>            <span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_data_team_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="s">&#39;Arsenal&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_data_points</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">1</span><span class="p">][</span><span class="mi">7</span><span class="p">],</span> <span class="s">&#39;87&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_get_min_score_difference</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">get_min_score_difference</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parsed_data</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_get_team</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">index_value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">get_min_score_difference</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parsed_data</span><span class="p">)</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">get_team</span><span class="p">(</span><span class="n">index_value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">parsed_data</span><span class="p">),</span> <span class="s">&#39;Liverpool&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are minimal changes here. At this point, you could create a separate CSV file for testing. Instead, let&rsquo;s go on to the next part and look at the CSV issue later.</p>

<blockquote><p>Remember: Let’s not over optimize too early &ndash; just make the minimal changes necessary to get the tests to pass. We do have some naming issues and a few other issues to refactor. However, let&rsquo;s work on the second part of the problem, incorporating the weather data into this code, then refactor at the end.</p></blockquote>

<a name="Part.2:.Weather"></a>
<h2>Part 2: Weather</h2>

<a name="Watch.our.tests.Fail"></a>
<h3>Watch our tests Fail</h3>

<p>Before we do anything, let&rsquo;s use the new CSV file and watch our tests fail:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>python parse_csv_test.py -v
</span><span class='line'>test_csv_read_data_headers <span class="o">(</span>__main__.ParseCSVTest<span class="o">)</span> ... FAIL
</span><span class='line'>test_csv_read_data_points <span class="o">(</span>__main__.ParseCSVTest<span class="o">)</span> ... FAIL
</span><span class='line'>test_csv_read_data_team_name <span class="o">(</span>__main__.ParseCSVTest<span class="o">)</span> ... FAIL
</span><span class='line'>test_get_min_score_difference <span class="o">(</span>__main__.ParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>test_get_team <span class="o">(</span>__main__.ParseCSVTest<span class="o">)</span> ... ok
</span></code></pre></td></tr></table></div></figure>


<p>Notice how the only tests that pass are the tests that use <code>parsed_data</code> rather than the CSV. This is a good indication that we really should be using the actual data for testing. Let&rsquo;s quickly refactor (again!):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">unittest</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">parse_csv</span> <span class="kn">import</span> <span class="n">ParseCSV</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">FootballParseCSVTest</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;football.csv&#39;</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">football</span> <span class="o">=</span> <span class="n">ParseCSV</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_data_headers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span>
</span><span class='line'>            <span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>            <span class="p">[</span><span class="s">&#39;Team&#39;</span><span class="p">,</span> <span class="s">&#39;Games&#39;</span><span class="p">,</span> <span class="s">&#39;Wins&#39;</span><span class="p">,</span> <span class="s">&#39;Losses&#39;</span><span class="p">,</span> <span class="s">&#39;Draws&#39;</span><span class="p">,</span> <span class="s">&#39;Goals&#39;</span><span class="p">,</span> <span class="s">&#39;Goals Allowed&#39;</span><span class="p">,</span> <span class="s">&#39;Points&#39;</span><span class="p">]</span>
</span><span class='line'>            <span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_data_team_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="s">&#39;Arsenal&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_data_points</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">1</span><span class="p">][</span><span class="mi">7</span><span class="p">],</span> <span class="s">&#39;87&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_get_min_score_difference</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">parsed_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">get_min_score_difference</span><span class="p">(</span><span class="n">parsed_data</span><span class="p">),</span> <span class="mi">19</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_get_team</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">parsed_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()</span>
</span><span class='line'>        <span class="n">index_value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">get_min_score_difference</span><span class="p">(</span><span class="n">parsed_data</span><span class="p">)</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">get_team</span><span class="p">(</span><span class="n">index_value</span><span class="p">,</span> <span class="n">parsed_data</span><span class="p">),</span> <span class="s">&#39;Leicester&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>These will pass. Now change the data so that they run with <em>weather.csv</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python parse_csv_test.py -v
</span><span class='line'>test_csv_read_data_headers <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... FAIL
</span><span class='line'>test_csv_read_data_points <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... FAIL
</span><span class='line'>test_csv_read_data_team_name <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... FAIL
</span><span class='line'>test_get_min_score_difference <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... ERROR
</span><span class='line'>test_get_team <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... ERROR
</span></code></pre></td></tr></table></div></figure>


<p>This is exactly what we want to see. Now we need to refactor both our code and tests to get our code to work with both data sets as well as simplify our tests to eliminate redundancy. (Notice a trend yet?)</p>

<a name="Refactor.Tests.and.Code"></a>
<h3>Refactor Tests and Code</h3>

<a name="Test"></a>
<h4>Test</h4>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">football_data</span> <span class="o">=</span> <span class="s">&#39;football.csv&#39;</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">weather_data</span> <span class="o">=</span> <span class="s">&#39;weather.csv&#39;</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">football</span> <span class="o">=</span> <span class="n">ParseCSV</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football_data</span><span class="p">)</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">weather</span> <span class="o">=</span> <span class="n">ParseCSV</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">weather_data</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here, we are using both data sets and instantiating multiple instances of the same class, <code>ParseCSV()</code>. <em>Yes, there is some redundancy here, but let&rsquo;s just keep it simple for now. We&rsquo;ll refactor at the end.</em></p>

<a name="Test"></a>
<h4>Test</h4>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">test_csv_read_data_headers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>        <span class="p">[</span><span class="s">&#39;Team&#39;</span><span class="p">,</span> <span class="s">&#39;Games&#39;</span><span class="p">,</span> <span class="s">&#39;Wins&#39;</span><span class="p">,</span> <span class="s">&#39;Losses&#39;</span><span class="p">,</span> <span class="s">&#39;Draws&#39;</span><span class="p">,</span> <span class="s">&#39;Goals&#39;</span><span class="p">,</span> <span class="s">&#39;Goals Allowed&#39;</span><span class="p">,</span> <span class="s">&#39;Points&#39;</span><span class="p">]</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">weather</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>        <span class="p">[</span><span class="s">&#39;Day&#39;</span><span class="p">,</span> <span class="s">&#39;MxT&#39;</span><span class="p">,</span> <span class="s">&#39;MnT&#39;</span><span class="p">,</span> <span class="s">&#39;AvT&#39;</span><span class="p">,</span> <span class="s">&#39;AvDP&#39;</span><span class="p">,</span> <span class="s">&#39;1HrP TPcpn&#39;</span><span class="p">,</span> <span class="s">&#39;PDir&#39;</span><span class="p">,</span> <span class="s">&#39;AvSp&#39;</span><span class="p">,</span> <span class="s">&#39;Dir&#39;</span><span class="p">,</span> <span class="s">&#39;MxS&#39;</span><span class="p">,</span> <span class="s">&#39;SkyC&#39;</span><span class="p">,</span> <span class="s">&#39;MxR&#39;</span><span class="p">,</span> <span class="s">&#39;Mn&#39;</span><span class="p">,</span> <span class="s">&#39;R AvSLP&#39;</span><span class="p">]</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">test_csv_read_random_data_points</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="s">&#39;Arsenal&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">1</span><span class="p">][</span><span class="mi">7</span><span class="p">],</span> <span class="s">&#39;87&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">weather</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="s">&#39;1&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">weather</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">1</span><span class="p">][</span><span class="mi">7</span><span class="p">],</span> <span class="s">&#39;9.6&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is straightforward. Comment out the other two tests and run just this one. It should pass.</p>

<a name="Test"></a>
<h4>Test</h4>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">test_get_min_difference</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="n">football_parsed_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">get_min_score_difference</span><span class="p">(</span><span class="n">football_parsed_data</span><span class="p">),</span> <span class="mi">19</span><span class="p">)</span>
</span><span class='line'>    <span class="n">weather_parsed_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">weather</span><span class="o">.</span><span class="n">read_data</span><span class="p">()</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">weather</span><span class="o">.</span><span class="n">get_min_score_difference</span><span class="p">(</span><span class="n">weather_parsed_data</span><span class="p">),</span> <span class="s">&quot;no idea&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Uncomment this test. It will fail:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python parse_csv_test.py -v
</span><span class='line'>test_csv_read_data_headers <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>test_csv_read_random_data_points <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>test_get_min_difference <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... FAIL
</span></code></pre></td></tr></table></div></figure>


<p>Why does it fail?</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>AssertionError: 2 !<span class="o">=</span> <span class="s1">&#39;no idea&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This essentially is saying that the smallest difference between the second and third column is row two. Is that correct? We addressed this very same issue earlier:</p>

<blockquote><p>Since, we don&rsquo;t know off hand what the smallest difference will be, we can just add the string &ldquo;no idea&rdquo;. You could update that when you know what the answer is after we add the <code>get_min_score_difference()</code> function to <em>parse_csv.py</em> &ndash; but how do we know if that answer is correct?</p>

<p>Keep in mind, that since this is a small amount of data, you can get away with calculating them all by hand and finding the smallest difference. Or you could also use test data.</p></blockquote>

<p>Let&rsquo;s go the other route this time: Just calculating it by hand. <em>Do not do this if you have a lot of data!</em>.</p>

<p>Do this now.</p>

<p>You should find that the row with the smallest difference is row 14 (or 13 minus the header). Update your tests, run them again, and they should still fail:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>AssertionError: 2 !<span class="o">=</span> 13
</span></code></pre></td></tr></table></div></figure>


<p>Why is this?</p>

<a name="Code"></a>
<h4>Code</h4>

<p>Go back to <em>parse.csv</em> and look at the <code>get_min_score_difference()</code> function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">get_min_score_difference</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parsed_data</span><span class="p">):</span>
</span><span class='line'>    <span class="n">parsed_data</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span><span class='line'>    <span class="n">goals</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">]</span>
</span><span class='line'>    <span class="n">goals_allowed</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">]</span>
</span><span class='line'>    <span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="nb">float</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">goals</span><span class="p">,</span> <span class="n">goals_allowed</span><span class="p">)]</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">values</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">values</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Did you figure it out?</p>

<p>We&rsquo;re passing in the column values &ndash; <code>x[5]</code> and x[6] &ndash; which are applicable only to the <em>football.csv</em>. Thus, we need to pass in either the column index values or the header names so that this function uses the right data regardless of the data set used. Since we&rsquo;re popping off the header, let&rsquo;s use the column index values:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">get_min_difference</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parsed_data</span><span class="p">,</span> <span class="n">column1</span><span class="p">,</span> <span class="n">column2</span><span class="p">):</span>
</span><span class='line'>    <span class="n">parsed_data</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span><span class='line'>    <span class="n">column1_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="n">column1</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">]</span>
</span><span class='line'>    <span class="n">column2_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="n">column2</span><span class="p">]</span><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">]</span>
</span><span class='line'>    <span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="nb">float</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">column1_list</span><span class="p">,</span> <span class="n">column2_list</span><span class="p">)]</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">values</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">values</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<a name="Test"></a>
<h4>Test</h4>

<p>Update the test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">test_get_min_difference</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="n">football_parsed_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">get_min_difference</span><span class="p">(</span><span class="n">football_parsed_data</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">),</span> <span class="mi">19</span><span class="p">)</span>
</span><span class='line'>    <span class="n">weather_parsed_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">weather</span><span class="o">.</span><span class="n">read_data</span><span class="p">()</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">weather</span><span class="o">.</span><span class="n">get_min_difference</span><span class="p">(</span><span class="n">weather_parsed_data</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="mi">13</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And they pass:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python parse_csv_test.py -v
</span><span class='line'>test_csv_read_data_headers <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>test_csv_read_random_data_points <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>test_get_min_difference <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>
</span><span class='line'>----------------------------------------------------------------------
</span><span class='line'>Ran 3 tests in 0.001s
</span><span class='line'>
</span><span class='line'>OK
</span></code></pre></td></tr></table></div></figure>


<p>Uncomment the last test and update <code>get_min_score_difference()</code> to <code>get_min_difference()</code> then pass in the columns:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">test_get_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="n">football_parsed_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">read_data</span><span class="p">()</span>
</span><span class='line'>    <span class="n">index_value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">get_min_difference</span><span class="p">(</span><span class="n">football_parsed_data</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">football</span><span class="o">.</span><span class="n">get_team</span><span class="p">(</span><span class="n">index_value</span><span class="p">,</span> <span class="n">football_parsed_data</span><span class="p">),</span> <span class="s">&#39;Leicester&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="n">weather_parsed_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">weather</span><span class="o">.</span><span class="n">read_data</span><span class="p">()</span>
</span><span class='line'>    <span class="n">index_value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">weather</span><span class="o">.</span><span class="n">get_min_difference</span><span class="p">(</span><span class="n">weather_parsed_data</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">weather</span><span class="o">.</span><span class="n">get_team</span><span class="p">(</span><span class="n">index_value</span><span class="p">,</span> <span class="n">weather_parsed_data</span><span class="p">),</span> <span class="s">&#39;14&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now they all pass:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'> python parse_csv_test.py -v
</span><span class='line'>test_csv_read_data_headers <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>test_csv_read_random_data_points <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>test_get_min_difference <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>test_get_name <span class="o">(</span>__main__.FootballParseCSVTest<span class="o">)</span> ... ok
</span><span class='line'>
</span><span class='line'>----------------------------------------------------------------------
</span><span class='line'>Ran 4 tests in 0.001s
</span><span class='line'>
</span><span class='line'>OK
</span></code></pre></td></tr></table></div></figure>


<a name="Add.test.data"></a>
<h3>Add test data</h3>

<p>Finally, let&rsquo;s add our own test data for use rather than using the actual CSV files to isolate test data from actual, real data.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">unittest</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">parse_csv</span> <span class="kn">import</span> <span class="n">ParseCSV</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">testParseCSVTest</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s">&#39;test.csv&#39;</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">test</span> <span class="o">=</span> <span class="n">ParseCSV</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">parsed_data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">read_data</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_data_headers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span>
</span><span class='line'>            <span class="bp">self</span><span class="o">.</span><span class="n">parsed_data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>            <span class="p">[</span><span class="s">&#39;Date&#39;</span><span class="p">,</span> <span class="s">&#39;Open&#39;</span><span class="p">,</span> <span class="s">&#39;High&#39;</span><span class="p">,</span> <span class="s">&#39;Low&#39;</span><span class="p">,</span> <span class="s">&#39;Close&#39;</span><span class="p">,</span> <span class="s">&#39;Volume&#39;</span><span class="p">,</span> <span class="s">&#39;Adj Close&#39;</span><span class="p">]</span>
</span><span class='line'>            <span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_csv_read_random_data_points</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="s">&#39;5/8/14&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">read_data</span><span class="p">()[</span><span class="mi">1</span><span class="p">][</span><span class="mi">6</span><span class="p">],</span> <span class="s">&#39;511&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_get_min_difference</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">get_min_difference</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parsed_data</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="mi">6</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_get_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">index_value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">get_min_difference</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parsed_data</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">get_team</span><span class="p">(</span><span class="n">index_value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">parsed_data</span><span class="p">),</span> <span class="s">&#39;4/30/14&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">unittest</span><span class="o">.</span><span class="n">main</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Run the tests. They should pass.</p>

<a name="One.last.thing...."></a>
<h3>One last thing &hellip;</h3>

<p>One thing to keep in mind is the nature of the <code>pop()</code> method. It&rsquo;s destructive, so it alters the original list, <code>parsed_data</code>, removing the headers permanently within the <code>get_min_difference()</code> function. What are the ramifications of this?</p>

<p>Let&rsquo;s test it out.</p>

<p>Add a <code>print</code> statement to the <code>test_get_name()</code> function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">get_team</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index_value</span><span class="p">,</span> <span class="n">parsed_data</span><span class="p">):</span>
</span><span class='line'>    <span class="k">print</span> <span class="n">parsed_data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span class='line'>    <span class="n">teams</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">]</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">teams</span><span class="p">[</span><span class="n">index_value</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Run the tests again.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="err">$</span> <span class="n">python</span> <span class="n">parse_csv_test</span><span class="o">.</span><span class="n">py</span>
</span><span class='line'><span class="o">...</span><span class="p">[</span><span class="s">&#39;5/8/14&#39;</span><span class="p">,</span> <span class="s">&#39;508.46&#39;</span><span class="p">,</span> <span class="s">&#39;517.23&#39;</span><span class="p">,</span> <span class="s">&#39;506.45&#39;</span><span class="p">,</span> <span class="s">&#39;511&#39;</span><span class="p">,</span> <span class="s">&#39;2015800&#39;</span><span class="p">,</span> <span class="s">&#39;511&#39;</span><span class="p">]</span>
</span><span class='line'><span class="o">.</span>
</span><span class='line'><span class="o">----------------------------------------------------------------------</span>
</span><span class='line'><span class="n">Ran</span> <span class="mi">4</span> <span class="n">tests</span> <span class="ow">in</span> <span class="mf">0.001</span><span class="n">s</span>
</span><span class='line'>
</span><span class='line'><span class="n">OK</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that row 0 contains data, not the headers. This can create problems. Sure, you could just assign a variable to the data when you pop it off &ndash; <code>headers = parsed_data.pop(0)</code> &ndash; then add the data back to the list. But, it&rsquo;s generally better to work with non-destructive methods if you do not actually need to alter the original structure.</p>

<p>Thus, let&rsquo;s use <code>slice</code> instead. Update the <code>get_min_difference()</code> function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">get_min_difference</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parsed_data</span><span class="p">,</span> <span class="n">column1</span><span class="p">,</span> <span class="n">column2</span><span class="p">):</span>
</span><span class='line'>    <span class="n">column1_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="n">column1</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">[</span><span class="mi">1</span><span class="p">:]]</span>
</span><span class='line'>    <span class="n">column2_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="n">column2</span><span class="p">]</span><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">[</span><span class="mi">1</span><span class="p">:]]</span>
</span><span class='line'>    <span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="nb">float</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">column1_list</span><span class="p">,</span> <span class="n">column2_list</span><span class="p">)]</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">values</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">values</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Run the test again. You should see the following failure:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="err">$</span> <span class="n">python</span> <span class="n">parse_csv_test</span><span class="o">.</span><span class="n">py</span>
</span><span class='line'><span class="o">...</span><span class="n">F</span>
</span><span class='line'><span class="o">======================================================================</span>
</span><span class='line'><span class="n">FAIL</span><span class="p">:</span> <span class="n">test_get_name</span> <span class="p">(</span><span class="n">__main__</span><span class="o">.</span><span class="n">testParseCSVTest</span><span class="p">)</span>
</span><span class='line'><span class="o">----------------------------------------------------------------------</span>
</span><span class='line'><span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
</span><span class='line'>  <span class="n">File</span> <span class="s">&quot;parse_csv_test.py&quot;</span><span class="p">,</span> <span class="n">line</span> <span class="mi">27</span><span class="p">,</span> <span class="ow">in</span> <span class="n">test_get_name</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">test</span><span class="o">.</span><span class="n">get_team</span><span class="p">(</span><span class="n">index_value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">parsed_data</span><span class="p">),</span> <span class="s">&#39;4/30/14&#39;</span><span class="p">)</span>
</span><span class='line'><span class="ne">AssertionError</span><span class="p">:</span> <span class="s">&#39;5/1/14&#39;</span> <span class="o">!=</span> <span class="s">&#39;4/30/14&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="o">----------------------------------------------------------------------</span>
</span><span class='line'><span class="n">Ran</span> <span class="mi">4</span> <span class="n">tests</span> <span class="ow">in</span> <span class="mf">0.001</span><span class="n">s</span>
</span><span class='line'>
</span><span class='line'><span class="n">FAILED</span> <span class="p">(</span><span class="n">failures</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is because we are now dealing with data that has the header back in within the <code>get_team</code> function while the header was sliced off in <code>get_min_difference()</code>. Thus, we need to update the <code>get_team()</code> function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">get_team</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index_value</span><span class="p">,</span> <span class="n">parsed_data</span><span class="p">):</span>
</span><span class='line'>    <span class="n">teams</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parsed_data</span><span class="p">[</span><span class="mi">1</span><span class="p">:]]</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">teams</span><span class="p">[</span><span class="n">index_value</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Run the tests one last time &hellip;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Flask by Example - Part 2 - Postgres, SQLAlchemy, and Alembic]]></title>
    <link href="https://realpython.com/blog/python/flask-by-example-part-2-postgres-sqlalchemy-and-alembic/"/>
    <updated>2014-04-29T10:53:49-07:00</updated>
    <id>https://realpython.com/blog/python/flask-by-example-part-2-postgres-sqlalchemy-and-alembic</id>
    <content type="html"><![CDATA[<p><em>The following is a guest post by Cam Linke, co-founder of <a href="http://startupedmonton.com/">Startup Edmonton</a>.</em></p>

<br>


<p>In this section we&rsquo;re going to get our database set up to store the results of our word counts. Along the way we&rsquo;ll set up a Postgres database, add SQLAlchemy to our app for use as an ORM, and use Alembic for our data migrations.</p>

<p><strong>Remember, here&rsquo;s what we&rsquo;re building: A Flask app with a simple text box. When you enter text into the box, the app processes and displays a count of how many times each word appears on the page.</strong></p>

<ol>
<li><a href="http://www.realpython.com/blog/python/flask-by-example-part-1-project-setup">Part One</a>: Setup a local development environment and then deploy both a staging environment and a production environment on Heroku.</li>
<li><strong>Part Two: Setup a PostgreSQL database along with SQLAlchemy and Alembic to handle migrations. (Current)</strong></li>
<li><a href="https://realpython.com/blog/python/flask-by-example-part-3-text-processing-with-requests-beautifulsoup-nltk/">Part Three</a>: Add in the back-end logic to scrape and then process the counting of words from a webpage using the requests, BeautifulSoup, and Natural Language Toolkit (NLTK) libraries.</li>
<li>Part Four: Implement a request queue backed by Redis to handle the actual text processing.</li>
<li>Part Five: Setup Angular on the front-end to continuously poll the back-end to see if the request is done.</li>
<li>Part Six: Add the D3 library into the mix to graph a frequency distribution and histogram.</li>
</ol>


<blockquote><p>Need the code? Grab it from the <a href="https://github.com/realpython/flask-by-example">repo</a>.</p></blockquote>

<a name="Install.Requirements"></a>
<h2>Install Requirements</h2>

<p>Tools we&rsquo;ll use in this part:</p>

<ul>
<li><strong>Postgres</strong> &ndash; <a href="http://www.postgresql.org/">http://www.postgresql.org/</a></li>
<li><strong>Psycopg2</strong> &ndash; <a href="http://initd.org/psycopg/">http://initd.org/psycopg/</a></li>
<li><strong>SQLAlchemy</strong> &ndash; <a href="http://www.sqlalchemy.org/">http://www.sqlalchemy.org/</a></li>
<li><strong>Alembic</strong> &ndash; <a href="http://alembic.readthedocs.org/en/latest/">http://alembic.readthedocs.org/en/latest/</a></li>
<li><strong>Flask-Migrate</strong> &ndash; <a href="http://flask-migrate.readthedocs.org/en/latest/">http://flask-migrate.readthedocs.org/en/latest/</a></li>
</ul>


<p>To get started install Postgres on your local computer if you don&rsquo;t have it already. Since Heroku uses Postgres it will be good for us to develop locally on the same database. If you don&rsquo;t have Postgres installed, <a href="http://postgresapp.com/">Postgres.app</a> is an easy way to get up and running quick for Mac users. Once you have Postgres installed and running, create a database called <em>wordcount_dev</em> to use as our local development database. In order to use our newly created database in the Flask app we&rsquo;re going to need to install a few things:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>workon wordcounts
</span><span class='line'><span class="nv">$ </span>pip install psycopg2 Flask-SQLAlchemy Flask-Migrate
</span><span class='line'><span class="nv">$ </span>pip freeze &gt; requirements.txt
</span></code></pre></td></tr></table></div></figure>


<p>Psycopg is is a Python adapter for Postgres, SQLAlchemy is an awesome Python ORM, and Flask-Migrate will install both that extension and Alembic which we&rsquo;ll use for our database migrations.</p>

<blockquote><p>If you&rsquo;re on Mavericks and having trouble installing psycopg2 check out <a href="http://stackoverflow.com/questions/22313407/clang-error-unknown-argument-mno-fused-madd-python-package-installation-fa">this</a> Stack Overflow article.</p></blockquote>

<a name="Update.Configuration"></a>
<h2>Update Configuration</h2>

<p>Add the following line to the <code>Config()</code> class in your <em>config.py</em> file to set your app to use the newly created database in development (local), staging, and production:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">SQLALCHEMY_DATABASE_URI</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;DATABASE_URL&#39;</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Also make sure to add the following import:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">os</span>
</span></code></pre></td></tr></table></div></figure>


<p>Your config file should now look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">os</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Config</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
</span><span class='line'>    <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>    <span class="n">TESTING</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>    <span class="n">CSRF_ENABLED</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>    <span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="s">&#39;this-really-needs-to-be-changed&#39;</span>
</span><span class='line'>    <span class="n">SQLALCHEMY_DATABASE_URI</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;DATABASE_URL&#39;</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">ProductionConfig</span><span class="p">(</span><span class="n">Config</span><span class="p">):</span>
</span><span class='line'>    <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">StagingConfig</span><span class="p">(</span><span class="n">Config</span><span class="p">):</span>
</span><span class='line'>    <span class="n">DEVELOPMENT</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>    <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">DevelopmentConfig</span><span class="p">(</span><span class="n">Config</span><span class="p">):</span>
</span><span class='line'>    <span class="n">DEVELOPMENT</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>    <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">TestingConfig</span><span class="p">(</span><span class="n">Config</span><span class="p">):</span>
</span><span class='line'>    <span class="n">TESTING</span> <span class="o">=</span> <span class="bp">True</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now when our config gets loaded into our app the appropriate database will be connected to it as well.</p>

<p>Similar to how we added an environment variable in the last post we are going to add a <code>DATABASE_URL</code> variable to our <em>postactivate</em> file. Using VIM you can do this in the following way:</p>

<p>Open your file in VIM:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="err">$</span> <span class="n">vi</span> <span class="err">$</span><span class="n">VIRTUAL_ENV</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">postactivate</span>
</span></code></pre></td></tr></table></div></figure>


<p>Press &lsquo;i&rsquo; on your keyboard to insert text and add the following line to your file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">export</span> <span class="n">DATABASE_URL</span><span class="o">=</span><span class="s">&quot;postgresql://localhost/wordcount_dev&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now hit escape, type &lsquo;:&rsquo; then &lsquo;wq&rsquo;, and press enter to save and close VIM.</p>

<p>Restart your environment:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="err">$</span> <span class="n">workon</span> <span class="n">wordcounts</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now in your <em>app.py</em> file import SQLAlchemy and connect to the database:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask.ext.sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">os</span>
</span><span class='line'>
</span><span class='line'><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><span class='line'><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">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;APP_SETTINGS&#39;</span><span class="p">])</span>
</span><span class='line'><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><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">hello</span><span class="p">():</span>
</span><span class='line'>    <span class="k">return</span> <span class="s">&quot;Hello World!&quot;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&lt;name&gt;&#39;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">hello_name</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
</span><span class='line'>    <span class="k">return</span> <span class="s">&quot;Hello {}!&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<a name="Model"></a>
<h2>Model</h2>

<p>Set up a basic model to hold the results of the wordcount by adding a <em>models.py</em> file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">app</span> <span class="kn">import</span> <span class="n">db</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">sqlalchemy.dialects.postgresql</span> <span class="kn">import</span> <span class="n">JSON</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Result</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
</span><span class='line'>    <span class="n">__tablename__</span> <span class="o">=</span> <span class="s">&#39;results&#39;</span>
</span><span class='line'>
</span><span class='line'>    <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><span class='line'>    <span class="n">url</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><span class='line'>    <span class="n">result_all</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">JSON</span><span class="p">)</span>
</span><span class='line'>    <span class="n">result_no_stop_words</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">JSON</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">result_all</span><span class="p">,</span> <span class="n">result_no_stop_words</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="n">url</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">result_all</span> <span class="o">=</span> <span class="n">result_all</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">result_no_stop_words</span> <span class="o">=</span> <span class="n">result_no_stop_words</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="k">return</span> <span class="s">&#39;&lt;id {}&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we&rsquo;re doing here is creating a table to store the results of our word count. We first import the database connection that we created in our <em>app.py</em> file as well as JSON from SQLAlchemy&rsquo;s <a href="http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#sqlalchemy.dialects.postgresql.JSON">PostgreSQL dialects</a>. JSON columns are fairly new to Postgres and are not available in every database supported by SQLAlchemy so we need to import it specifically.</p>

<p>Next we create a <code>Result()</code> class and assign it a table name of <code>results</code>. We then set the attributes that we want to store for a result &ndash; the &lsquo;id&rsquo; of the result we stored, the &lsquo;url&rsquo; that we counted the words from, a full list of words that we counted, and a list of words that we counted minus stop words (more on this later).</p>

<p>We then create an <code>__init__()</code> method that will run the first time we create a new result and, finally, a <code>__repr__()</code> method to represent the object when we query for it.</p>

<a name="Local.Migration"></a>
<h2>Local Migration</h2>

<p>We are going to use Alembic and Flask-Migrate to migrate our database to the latest version. Alembic is migration library for SQLAlchemy and could be used without Flask-Migrate if you want. However Flask-Migrate does help with some of the setup and makes things easier.</p>

<p>Create a new file called <em>manage.py</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">flask.ext.script</span> <span class="kn">import</span> <span class="n">Manager</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask.ext.migrate</span> <span class="kn">import</span> <span class="n">Migrate</span><span class="p">,</span> <span class="n">MigrateCommand</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">os</span>
</span><span class='line'>
</span><span class='line'><span class="kn">from</span> <span class="nn">app</span> <span class="kn">import</span> <span class="n">app</span><span class="p">,</span> <span class="n">db</span>
</span><span class='line'><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">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;APP_SETTINGS&#39;</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="n">migrate</span> <span class="o">=</span> <span class="n">Migrate</span><span class="p">(</span><span class="n">app</span><span class="p">,</span> <span class="n">db</span><span class="p">)</span>
</span><span class='line'><span class="n">manager</span> <span class="o">=</span> <span class="n">Manager</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">manager</span><span class="o">.</span><span class="n">add_command</span><span class="p">(</span><span class="s">&#39;db&#39;</span><span class="p">,</span> <span class="n">MigrateCommand</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">manager</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>In order to use Flask-Migrate we need to import <code>Manager</code> as well as <code>Migrate</code> and <code>MigrateCommand</code> to our <em>manage.py</em> file. We also import <code>app</code> and <code>db</code> so we have access to them within the script.</p>

<p>First we set our config to get our environment &ndash; based on the environment variable &ndash; and create a migrate instance with <code>app</code> and <code>db</code> as the arguments and set up a <code>manager</code> command to initialize a <code>Manager</code> instance for our app. Finally we add the <code>db</code> command to our manager so that we can run our migrations from the command line.</p>

<p>In order to run our migrations initialize Alembic:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python manage.py db init
</span><span class='line'>  Creating directory flask-by-example/migrations ... <span class="k">done</span>
</span><span class='line'><span class="k">  </span>Creating directory flask-by-example/migrations/versions ... <span class="k">done</span>
</span><span class='line'><span class="k">  </span>Generating flask-by-example/migrations/alembic.ini ... <span class="k">done</span>
</span><span class='line'><span class="k">  </span>Generating flask-by-example/migrations/env.py ... <span class="k">done</span>
</span><span class='line'><span class="k">  </span>Generating flask-by-example/migrations/env.pyc ... <span class="k">done</span>
</span><span class='line'><span class="k">  </span>Generating flask-by-example/migrations/README ... <span class="k">done</span>
</span><span class='line'><span class="k">  </span>Generating flask-by-example/migrations/script.py.mako ... <span class="k">done</span>
</span><span class='line'><span class="k">  </span>Please edit configuration/connection/logging settings in
</span><span class='line'>  <span class="s1">&#39;flask-by-example/migrations/alembic.ini&#39;</span> before proceeding.
</span></code></pre></td></tr></table></div></figure>


<p>After you run the database initialization you will see a new folder called &ldquo;migrations&rdquo; in the project. This holds the setup necessary for Alembic to run migrations on the project. Inside of &ldquo;migrations&rdquo; you will see that it has a folder called &ldquo;versions&rdquo;, containing the migration scripts as they are created.</p>

<p>Let&rsquo;s create our first migration by running the <code>migrate</code> command.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python manage.py db migrate
</span><span class='line'>  INFO  <span class="o">[</span>alembic.migration<span class="o">]</span> Context impl PostgresqlImpl.
</span><span class='line'>  INFO  <span class="o">[</span>alembic.migration<span class="o">]</span> Will assume transactional DDL.
</span><span class='line'>  INFO  <span class="o">[</span>alembic.autogenerate.compare<span class="o">]</span> Detected added table <span class="s1">&#39;results&#39;</span>
</span><span class='line'>  Generating /wordcount/migrations/versions/20ff8063fe45_.py ... <span class="k">done</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now you&rsquo;ll notice in your &ldquo;versions&rdquo; folder there is a migration file. This file is autogenerated by Alembic based on the model. You could generate (or edit) this file yourself; however, for a lot of cases the autogenerated file will do.</p>

<p>Now we&rsquo;ll apply our upgrades to our database using the <code>db upgrade</code> command:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python manage.py db upgrade
</span><span class='line'>  INFO  <span class="o">[</span>alembic.migration<span class="o">]</span> Context impl PostgresqlImpl.
</span><span class='line'>  INFO  <span class="o">[</span>alembic.migration<span class="o">]</span> Will assume transactional DDL.
</span><span class='line'>  INFO  <span class="o">[</span>alembic.migration<span class="o">]</span> Running upgrade None -&gt; 20ff8063fe45, empty message
</span></code></pre></td></tr></table></div></figure>


<p>Our database is now ready for us to use in our app.</p>

<a name="Remote.Migration"></a>
<h2>Remote Migration</h2>

<p>Finally, let&rsquo;s apply the migrations to our Heroku databases. First, though, we need to add the details of our staging and production databases to our <em>config.py</em> file. To check if you have a database set up on your staging server run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku config --app wordcounts-stage
</span><span class='line'><span class="o">===</span> wordcount-stage Config Vars
</span><span class='line'>APP_SETTINGS: config.StagingConfig
</span></code></pre></td></tr></table></div></figure>


<p><em>Make sure to replace <code>wordcount-stage</code> with the name of your staging app.</em></p>

<p>Since we don&rsquo;t see anything about a database, we need to add the Postgres addon to the staging server. To do so, run the following to add the Postgres addon to your Heroku app:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku addons:add heroku-postgresql:dev --app wordcounts-stage
</span><span class='line'>  Adding heroku-postgresql:dev on wordcount-stage... <span class="k">done</span>, v8 <span class="o">(</span>free<span class="o">)</span>
</span><span class='line'>  Attached as HEROKU_POSTGRESQL_AMBER_URL
</span><span class='line'>  Database has been created and is available
</span><span class='line'>   ! This database is empty. If upgrading, you can transfer
</span><span class='line'>   ! data from another database with pgbackups:restore.
</span><span class='line'>  Use <span class="sb">`</span>heroku addons:docs heroku-postgresql:dev<span class="sb">`</span> to view documentation.
</span></code></pre></td></tr></table></div></figure>


<p>Now when we run Heroku config again we should see the connection settings for our URL.</p>

<p>For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>APP_SETTINGS:               config.StagingConfig
</span><span class='line'>DATABASE_URL:               postgres://srxgxusbbyadyc:8NA0X-zdGZfPwPhfOtLuLZ5hzI@ec2-54-221-243-6.compute-1.amazonaws.com:5432/d7j5r8c30kbvuh
</span><span class='line'>HEROKU_POSTGRESQL_CYAN_URL: postgres://srxgxusbbyadyc:8NA0X-zdGZfPwPhfOtLuLZ5hzI@ec2-54-221-243-6.compute-1.amazonaws.com:5432/d7j5r8c30kbvuh
</span></code></pre></td></tr></table></div></figure>


<p>Next we need to commit the changes that you&rsquo;ve made to git and push to your staging server:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>git push stage master
</span></code></pre></td></tr></table></div></figure>


<p>Run the migrations that we created to migrate our staging database. We do this by using the <code>heroku run</code> command to run python scripts within our Heroku app. We will use this to run the same <code>db upgrade</code> command from our <em>manage.py</em> file.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku run python manage.py db upgrade --app wordcounts-stage
</span><span class='line'>  Running <span class="sb">`</span>python manage.py db upgrade<span class="sb">`</span> attached to terminal... up, run.4755
</span><span class='line'>  INFO  <span class="o">[</span>alembic.migration<span class="o">]</span> Context impl PostgresqlImpl.
</span><span class='line'>  INFO  <span class="o">[</span>alembic.migration<span class="o">]</span> Will assume transactional DDL.
</span><span class='line'>  INFO  <span class="o">[</span>alembic.migration<span class="o">]</span> Running upgrade None -&gt; 20ff8063fe45, empty message
</span></code></pre></td></tr></table></div></figure>


<p>Note how we only ran the upgrade, not the <code>init</code> or <code>migrate</code> commands like before. We already have our migration setup and ready to go, we only need to run it on our Heroku database.</p>

<p>Let&rsquo;s now do the same for our production site. Set up a database for your production app on Heroku. Push your changes to your production site. Notice how you don&rsquo;t have to make any changes to the config file &ndash; it&rsquo;s setting the database based on the newly created <code>DATABASE_URL</code> environment variable.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku addons:add heroku-postgresql:dev --app wordcounts-pro
</span><span class='line'><span class="nv">$ </span>git push pro master
</span><span class='line'><span class="nv">$ </span>heroku run python manage.py db upgrade --app wordcounts-pro
</span></code></pre></td></tr></table></div></figure>


<p>Now both our staging and production sites have their databases set up and are migrated &ndash; and ready to go!</p>

<blockquote><p>When you apply a new migration to your production database, there could be down time. If this is an issue, you can setup database replication by adding a &ldquo;follower&rdquo; (commonly known as a slave) database. For more on this, check out the official Heroku <a href="https://devcenter.heroku.com/articles/heroku-postgres-follower-databases">documentation</a>.</p></blockquote>

<a name="Sanity.Check"></a>
<h2>Sanity Check</h2>

<p>Remember in Part 1, when we tested the environment variables to make sure the right environment was being detected by adding a print statement to <em>app.py</em> &ndash; <code>print os.environ['APP_SETTINGS']</code>? Well, let&rsquo;s do the same thing, but test the Database URIs by adding a print to the bottom of <em>config.py</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">print</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;DATABASE_URL&#39;</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now let&rsquo;s test.</p>

<p><strong>Local</strong>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="err">$</span> <span class="n">python</span> <span class="n">config</span><span class="o">.</span><span class="n">py</span>
</span><span class='line'><span class="n">postgresql</span><span class="p">:</span><span class="o">//</span><span class="n">localhost</span><span class="o">/</span><span class="n">wordcount_dev</span>
</span></code></pre></td></tr></table></div></figure>


<p>Commit and push again to staging and production. Now let&rsquo;s test it out&hellip;</p>

<p><strong>Staging</strong>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku run python config.py  --app wordcounts-stage
</span><span class='line'>Running <span class="sb">`</span>python config.py<span class="sb">`</span> attached to terminal... up, run.1572
</span><span class='line'>postgres://eccqpmccvlokrj:d0iLgQB8naQ2Pg8HL4q61G9gOd@ec2-54-235-250-41.compute-1.amazonaws.com:5432/dep90ehmacu89e
</span></code></pre></td></tr></table></div></figure>


<p><strong>Production</strong>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku run python config.py  --app wordcounts-pro
</span><span class='line'>Running <span class="sb">`</span>python config.py<span class="sb">`</span> attached to terminal... up, run.3993
</span><span class='line'>postgres://rsjezmhdfavadr:_ams4r9uEHXcGCZOcnDqqD6Pxs@ec2-54-235-250-41.compute-1.amazonaws.com:5432/d6dpkb5kmd7bg9
</span></code></pre></td></tr></table></div></figure>


<p>The URIs for the staging and production should match the URIs displayed when we ran the <code>heroku</code> config commands. Test this out again:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku config --app wordcounts-stage
</span></code></pre></td></tr></table></div></figure>


<p>and</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku config --app wordcount-pro
</span></code></pre></td></tr></table></div></figure>


<a name="Conclusion"></a>
<h2>Conclusion</h2>

<p>That&rsquo;s it for part 2. I hope database migrations make better sense now. Please comment below with questions. In Part 3 we&rsquo;re going to build the word counting functionality and have it sent to a request queue to deal with the longer running wordcount processing. See you next time. Cheers!</p>

<p>Don&rsquo;t forget to remove the print statement from the config file when done, commit, and push back up to your various environments.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Flask by Example - Part 1 - Project Setup]]></title>
    <link href="https://realpython.com/blog/python/flask-by-example-part-1-project-setup/"/>
    <updated>2014-04-21T10:09:52-07:00</updated>
    <id>https://realpython.com/blog/python/flask-by-example-part-1-project-setup</id>
    <content type="html"><![CDATA[<p><em>The following is a guest post by Cam Linke, co-founder of <a href="http://startupedmonton.com/">Startup Edmonton</a>.</em></p>

<br>


<p>Welcome! Today we&rsquo;re going to build an app using Flask with a simple text box that you enter text into and the app processes and displays a count of how many times each word appears on the page.</p>

<ol>
<li><strong>Part One: Setup a local development environment and then deploy both a staging environment and a production environment on Heroku. (Current)</strong></li>
<li><a href="http://www.realpython.com/blog/flask-by-example-part-2-postgres-sqlalchemy-and-alembic">Part Two</a>: Setup a PostgreSQL database along with SQLAlchemy and Alembic to handle migrations.</li>
<li><a href="https://realpython.com/blog/python/flask-by-example-part-3-text-processing-with-requests-beautifulsoup-nltk/">Part Three</a>: Add in the back-end logic to scrape and then process the counting of words from a webpage using the requests, BeautifulSoup, and Natural Language Toolkit (NLTK) libraries.</li>
<li>Part Four: Implement a request queue backed by Redis to handle the actual text processing.</li>
<li>Part Five: Setup Angular on the front-end to continuously poll the back-end to see if the request is done.</li>
<li>Part Six: Add the D3 library into the mix to graph a frequency distribution and histogram.</li>
</ol>


<a name="Setup"></a>
<h2>Setup</h2>

<p>We&rsquo;ll start with a <em>basic &ldquo;Hello World&rdquo; app on Heroku with staging (or pre-production) and production environments</em>.</p>

<p>To get our initial setup created we&rsquo;re going to use Virtualenv and Virtualenvwrapper. This will give us a few extra tools to help us silo our environment. I&rsquo;m going to assume for this tutorial you&rsquo;ve used the following tools before:</p>

<ul>
<li><strong>Virtualenv</strong> &ndash; <a href="http://www.virtualenv.org/en/latest/">http://www.virtualenv.org/en/latest/</a></li>
<li><strong>Virtualenvwrapper</strong> &ndash; <a href="http://virtualenvwrapper.readthedocs.org/en/latest/">http://virtualenvwrapper.readthedocs.org/en/latest/</a></li>
<li><strong>Flask</strong> &ndash; <a href="http://flask.pocoo.org/">http://flask.pocoo.org/</a></li>
<li><strong>git/Github</strong> &ndash; <a href="http://try.github.io/levels/1/challenges/1">http://try.github.io/levels/1/challenges/1</a></li>
<li><strong>Heroku (basics)</strong> &ndash; <a href="https://devcenter.heroku.com/articles/getting-started-with-python">https://devcenter.heroku.com/articles/getting-started-with-python</a></li>
</ul>


<p>First things first, let&rsquo;s get a repo set up. Initialize a new git repo within your working directory:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>git init
</span></code></pre></td></tr></table></div></figure>


<p>Next, we&rsquo;re going to use Virtualenvwrapper to set up a new virtual environment by running the following command:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>mkvirtualenv wordcounts
</span></code></pre></td></tr></table></div></figure>


<p>This creates a new virtualenv for us. Along with creating a new virtualenv, it creates some new options, including <em><a href="http://virtualenvwrapper.readthedocs.org/en/latest/scripts.html#scripts-postactivate">Postactivate</a></em>, after you run the <code>workon</code> command to start your virtual environment. This is going to help us later when we are setting up some environment variables &ndash; but for now we&rsquo;re also going to use it to automatically jump to our project when we first start it.</p>

<p>Open up the <em>postactivate</em> file. The easiest way to do this is with VIM:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>vi <span class="nv">$VIRTUAL_ENV</span>/bin/postactivate
</span></code></pre></td></tr></table></div></figure>


<p>Add the following line to your project:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nb">cd</span> ~/path/to/your/project
</span></code></pre></td></tr></table></div></figure>


<p><em>Make sure to alter the above command for your environment. For example, my working directory is on my desktop &ndash; so my path is: <code>cd ~/Documents/repos/realpython/flask-by-example</code>.</em></p>

<blockquote><p>Within VIM, press &ldquo;i&rdquo; to enter the INSERT mode. Paste the line in the file, then press  &ldquo;escape&rdquo; to exit INSERT mode. Finally press &ldquo;:&rdquo;, then &ldquo;w&rdquo;, and finally &ldquo;q&rdquo; to save and exit VIM.</p></blockquote>

<p>Now open a new terminal window and run the following command:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>workon wordcount
</span></code></pre></td></tr></table></div></figure>


<p>If all is setup properly, it will activate your environment and move you directly to the project directory. A nice timesaver.</p>

<blockquote><p>If you are having problems with virtualenvwrapper, just use virtualenv.</p></blockquote>

<p>Next we&rsquo;re going to get our basic structure for our app set up. Add the following files to your &ldquo;flask-by-example&rdquo; folder:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>touch app.py .gitignore README.md requirements.txt
</span></code></pre></td></tr></table></div></figure>


<p>This will give you the following structure:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>flask-by-example
</span><span class='line'>    ├── README.md
</span><span class='line'>    ├── app.py
</span><span class='line'>    └── requirements.txt
</span></code></pre></td></tr></table></div></figure>


<p>Be sure to update the <em>.gitignore</em> file from the <a href="https://github.com/realpython/flask-by-example">repo</a>.</p>

<p>Next install Flask:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>pip install flask
</span></code></pre></td></tr></table></div></figure>


<p>Add the installed libraries to our <em>requirements.txt</em> file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>pip freeze &gt; requirements.txt
</span></code></pre></td></tr></table></div></figure>


<p>Open up <em>app.py</em> in your favorite editor and add the following code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
</span><span class='line'><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><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">hello</span><span class="p">():</span>
</span><span class='line'>    <span class="k">return</span> <span class="s">&quot;Hello World!&quot;</span>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Run the app:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python app.py
</span></code></pre></td></tr></table></div></figure>


<p>And you should see your basic Hello world app in action on <a href="http://localhost:5000/">http://localhost:5000/</a>. Kill the server.</p>

<p>Next we&rsquo;re going to set up our Heroku environments for both our production and staging app.</p>

<a name="Setup.Heroku"></a>
<h2>Setup Heroku</h2>

<p>I&rsquo;m going to assume you have the Heroku <a href="https://toolbelt.heroku.com/">Toolbelt</a> installed. For more basic information about setting up your Heroku app for use with Python see the following <a href="ttps://devcenter.heroku.com/articles/getting-started-with-python">link</a>.</p>

<p>After you have Heroku setup on your machine create a Procfile:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>touch Procfile
</span></code></pre></td></tr></table></div></figure>


<p>Add the following line to your newly created file</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">web</span><span class="p">:</span> <span class="n">gunicorn</span> <span class="n">app</span><span class="p">:</span><span class="n">app</span>
</span></code></pre></td></tr></table></div></figure>


<p>Make sure to add gunicorn to your <em>requirments.txt</em> file</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>pip install gunicorn
</span><span class='line'><span class="nv">$ </span>pip freeze &gt; requirements.txt
</span></code></pre></td></tr></table></div></figure>


<p>Commit your changes in git and optionally PUSH to Github, then create two new Heroku apps.</p>

<p>One for production:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku create wordcounts-pro
</span></code></pre></td></tr></table></div></figure>


<p>And one for staging:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku create wordcounts-stage
</span></code></pre></td></tr></table></div></figure>


<p>Add your new apps to your git remotes. Make sure to name one <em>pro</em> (for &ldquo;production&rdquo;) and the other <em>stage</em> (for &ldquo;staging&rdquo;):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>git remote add pro git@heroku.com:YOUR_APP_NAME.git
</span><span class='line'><span class="nv">$ </span>git remote add stage git@heroku.com:YOUR_APP_NAME.git
</span></code></pre></td></tr></table></div></figure>


<p>Now we can push both of our apps live to Heroku.</p>

<ul>
<li>For staging: <code>git push stage master</code></li>
<li>For production: <code>git push pro master</code></li>
</ul>


<p>Once both of those have been pushed, open them up in your web browser and see that your app is working on both URLs.</p>

<a name="Staging.Production.Workflow"></a>
<h2>Staging/Production Workflow</h2>

<p>Let&rsquo;s make a change to our app and push only to staging:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
</span><span class='line'><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><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">hello</span><span class="p">():</span>
</span><span class='line'>    <span class="k">return</span> <span class="s">&quot;Hello World!&quot;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&lt;name&gt;&#39;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">hello_name</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
</span><span class='line'>    <span class="k">return</span> <span class="s">&quot;Hello {}!&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Run your app locally to make sure everything works &ndash; <code>python app.py</code></p>

<p>Test it out by adding a name after the URL. For example: <a href="http://localhost:5000/mike">http://localhost:5000/mike</a>.</p>

<p>Now we want to try out our changes on staging before we push them live to production. Make sure your changes are committed in git and then push your work up to staging &ndash; <code>git push stage master</code>.</p>

<p>Now if you navigate to your staging environment, you&rsquo;ll be able to use the new URL &ndash; i.e., &ldquo;/mike&rdquo; and get &ldquo;Hello NAME&rdquo; based on what you put into the URL as the output in the browser. However, if you try the same thing on the production site you will get an error. <strong>So we can build things and test them out on staging and then when we&rsquo;re happy, push them live to production.</strong></p>

<p>Let&rsquo;s push our site to production now that we&rsquo;re happy with it &ndash; <code>git push pro master</code></p>

<p>Now we have the same functionality live on our production site.</p>

<p><strong>This staging/production workflow allows us to make changes, show things to clients, etc., all within a sandboxed server without causing any changes to the live production site that users are, well, using.</strong></p>

<a name="Config.Settings"></a>
<h2>Config Settings</h2>

<p>The last thing that we&rsquo;re going to do is set up different config environments for our app. Often there are things that are going to be different between your local, staging, and production setups. You’ll want to connect to different databases, have different AWS keys, etc. Let’s set up a config file to deal with the different environments.</p>

<p>Add a <em>config.py</em> file to your project:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>touch config.py
</span></code></pre></td></tr></table></div></figure>


<p>With our config file we&rsquo;re going to borrow a bit from how Django&rsquo;s config is set up. We&rsquo;ll have a base config class that the other config classes inherit from. Then we&rsquo;ll import the appropriate config class as needed.</p>

<p>Add the following to your newly created <em>config.py</em> file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">Config</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
</span><span class='line'>    <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>    <span class="n">TESTING</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>    <span class="n">CSRF_ENABLED</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>    <span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="s">&#39;this-really-needs-to-be-changed&#39;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">ProductionConfig</span><span class="p">(</span><span class="n">Config</span><span class="p">):</span>
</span><span class='line'>    <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">StagingConfig</span><span class="p">(</span><span class="n">Config</span><span class="p">):</span>
</span><span class='line'>    <span class="n">DEVELOPMENT</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>    <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">DevelopmentConfig</span><span class="p">(</span><span class="n">Config</span><span class="p">):</span>
</span><span class='line'>    <span class="n">DEVELOPMENT</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>    <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">TestingConfig</span><span class="p">(</span><span class="n">Config</span><span class="p">):</span>
</span><span class='line'>    <span class="n">TESTING</span> <span class="o">=</span> <span class="bp">True</span>
</span></code></pre></td></tr></table></div></figure>


<p>We set up a base Config class with some basic setup that our other config classes inherit from. Now we&rsquo;ll be able to import the appropriate config class based on the current environment. Thus, we can use environment variables to choose which settings we’re going to use based on the environment (e.g., local, staging, production).</p>

<a name="Local.Settings"></a>
<h3>Local Settings</h3>

<p>To set up our <code>APP_SETTINGS</code> variable locally, we can use our Virtualenvwrapper <em>postactivate</em> file again.</p>

<p>Add the following line to your <em>postactivate</em> file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nb">export </span><span class="nv">APP_SETTINGS</span><span class="o">=</span><span class="s2">&quot;config.DevelopmentConfig&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Reload your environment by running the <code>workon wordcounts</code> command again:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>workon wordcounts
</span></code></pre></td></tr></table></div></figure>


<p>Now when you run your app it will import the configuration that you set up in your <code>DevelopmentConfig</code> class.</p>

<a name="Heroku.Settings"></a>
<h3>Heroku Settings</h3>

<p>Similarly we’re going to set environment variables on Heroku.</p>

<p>For staging run the following command:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku config:set <span class="nv">APP_SETTINGS</span><span class="o">=</span>config.StagingConfig --remote stage
</span></code></pre></td></tr></table></div></figure>


<p>For production:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku config:set <span class="nv">APP_SETTINGS</span><span class="o">=</span>config.ProductionConfig --remote pro
</span></code></pre></td></tr></table></div></figure>


<p>To make sure we use the right environment change <em>app.py</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">os</span>
</span><span class='line'>
</span><span class='line'><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><span class='line'><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">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;APP_SETTINGS&#39;</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">hello</span><span class="p">():</span>
</span><span class='line'>    <span class="k">return</span> <span class="s">&quot;Hello World!&quot;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/&lt;name&gt;&#39;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">hello_name</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
</span><span class='line'>    <span class="k">return</span> <span class="s">&quot;Hello {}!&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>We imported <code>os</code> and used the <code>os.environ</code> method to import the appropriate <code>APP_SETTINGS</code> variables, depending on our environment. We then set up the config in our app with the <code>app.config.from_object</code> method.</p>

<p>Commit and push your changes to both staging and production (and Github if you have it setup).</p>

<p>Want to test the environment variables out to make sure it&rsquo;s detecting the right environment (sanity check!)? Add a print statement to <em>app.py</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">print</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;APP_SETTINGS&#39;</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now when you run the app, it will show which config settings it&rsquo;s importing:</p>

<p><strong>Local</strong>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python app.py
</span><span class='line'>config.DevelopmentConfig
</span></code></pre></td></tr></table></div></figure>


<p>Commit and push again to staging and production. Now let&rsquo;s test it out&hellip;</p>

<p><strong>Staging</strong>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku run python app.py --app wordcounts-stage
</span><span class='line'>Running <span class="sb">`</span>python app.py<span class="sb">`</span> attached to terminal... up, run.2830
</span><span class='line'>config.StagingConfig
</span></code></pre></td></tr></table></div></figure>


<p><strong>Production</strong>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>heroku run python app.py --app wordcounts-pro
</span><span class='line'>Running <span class="sb">`</span>python app.py<span class="sb">`</span> attached to terminal... up, run.1360
</span><span class='line'>config.ProductionConfig
</span></code></pre></td></tr></table></div></figure>


<p>Be sure to remove <code>print os.environ['APP_SETTINGS']</code> when done, commit, and push back up to your various environments.</p>

<a name="Conclusion"></a>
<h2>Conclusion</h2>

<p>With the setup out of the way, we&rsquo;re going to start to build out the word counting functionality of this app. Along the way, we&rsquo;ll add a request queue to set up background processing for the word count portion (part 3), as well dig further into our Heroku setup by setting up the configuration and migrations for our database (<a href="http://www.realpython.com/blog/flask-by-example-part-2-postgres-sqlalchemy-and-alembic">part2</a>) which we&rsquo;ll use to store our word count results.</p>

<p>Best!</p>

<blockquote><p>Grab the code from the <a href="https://github.com/realpython/flask-by-example">repo</a>.</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Flask-Login for User Management with Flask]]></title>
    <link href="https://realpython.com/blog/python/using-flask-login-for-user-management-with-flask/"/>
    <updated>2014-04-07T09:46:55-07:00</updated>
    <id>https://realpython.com/blog/python/using-flask-login-for-user-management-with-flask</id>
    <content type="html"><![CDATA[<p><em>The following is a guest post by <a href="http://www.jeffknupp.com/">Jeff Knupp</a>, author of <a href="http://www.jeffknupp.com/writing-idiomatic-python-ebook/">Writing Idiomatic Python</a>. Jeff currently has a <a href="https://www.kickstarter.com/projects/1219760486/a-writing-idiomatic-python-video-series-watch-and">Kickstarter</a> campaign running to turn the book into a video series &ndash; check it out!</em></p>

<hr>


<p>A few months ago, I grew tired of the digital goods payment service I used to sell my book and decided to write my own. Two hours later, <a href="http://www.github.com/jeffknupp/bull/">bull</a> was born.  It was a little application written using Flask and Python, which turned out to be an excellent choice for implementation. It started with bare bones functionality: A customer could enter their details in a Stripe JavaScript pop-up, <code>bull</code> would record their email address and create a unique id for the purchase, then associate the user with the content they purchased.</p>

<p>It worked fantastically well. Whereas before a potential customer had to not only, enter their full name and address (both of which I had no use for), they also had to <em>create an account on my payment processor&rsquo;s site</em>. I&rsquo;m not sure how many sales I lost due to the convoluted checkout process, but I&rsquo;m sure it was a good deal. With bull, the time between clicking the &ldquo;Buy Now&rdquo; button on the book sales page to actually reading the book was about 10 seconds. Customers loved it.</p>

<p>I loved it too, but for a slightly different reason: since <code>bull</code> was running on my web server, I could get a much richer set of analytics than if I had to send customers to a third-party site for payment. This opened the door to a host of new possibilities: A/B testing, analytics reports, custom sales reports. I was stoked.</p>

<a name="Adding.Users"></a>
<h2>Adding Users</h2>

<p>I decided that, at a minimum, I wanted <code>bull</code> to be able to display a &ldquo;Sales Overview&rdquo; page that contained basic sales data: transaction information, graphs of sales over time, etc. To do that (in a secure manner), I needed to add authentication and authorization to my little Flask app. Helpfully, though, I only needed to support a <em>single</em>, &ldquo;admin&rdquo; user who was authorized to view
reports.</p>

<p>Luckily, as is usually the case, a third-party package already existed to handle this. <a href="https://flask-login.readthedocs.org/en/latest/">Flask-login</a> is a Flask extension that enables user authentication. All that&rsquo;s required is a <code>User</code> model and a few simple functions. Let&rsquo;s take a look at what was required.</p>

<a name="The..code.User..code..Model"></a>
<h3>The <code>User</code> Model</h3>

<p><code>bull</code> was already using <a href="http://pythonhosted.org/Flask-SQLAlchemy/">Flask-sqlalchemy</a> to create <code>purchase</code> and <code>product</code> models which captured the information about a sale and a product, respectively. Flask-login requires a <code>User</code> model with the following
properties:</p>

<ul>
<li>has an <code>is_authenticated()</code> method that returns <code>True</code> if the user has provided
valid credentials</li>
<li>has an <code>is_active()</code> method that returns <code>True</code> if the user&rsquo;s account is
active</li>
<li>has an <code>is_anonymous()</code> method that returns <code>True</code> if the current user is an
anonymous user</li>
<li>has a <code>get_id()</code> method which, given a <code>User</code> instance, returns the unique ID
for that object</li>
</ul>


<p>While Flask-login helpfully provides a <code>UserMixin</code> class that provides default implementations of all of these, I just defined everything required like so:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c">#!py</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask.ext.sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
</span><span class='line'>
</span><span class='line'><span class="n">db</span> <span class="o">=</span> <span class="n">SQLAlchemy</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'><span class="c">#...</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">User</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
</span><span class='line'>    <span class="sd">&quot;&quot;&quot;An admin user capable of viewing reports.</span>
</span><span class='line'>
</span><span class='line'><span class="sd">    :param str email: email address of user</span>
</span><span class='line'><span class="sd">    :param str password: encrypted password for the user</span>
</span><span class='line'>
</span><span class='line'><span class="sd">    &quot;&quot;&quot;</span>
</span><span class='line'>    <span class="n">__tablename__</span> <span class="o">=</span> <span class="s">&#39;user&#39;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">email</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="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</span><span class='line'>    <span class="n">password</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><span class='line'>    <span class="n">authenticated</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><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">is_active</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="sd">&quot;&quot;&quot;True, as all users are active.&quot;&quot;&quot;</span>
</span><span class='line'>        <span class="k">return</span> <span class="bp">True</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">get_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="sd">&quot;&quot;&quot;Return the email address to satisfy Flask-Login&#39;s requirements.&quot;&quot;&quot;</span>
</span><span class='line'>        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">email</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">is_authenticated</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="sd">&quot;&quot;&quot;Return True if the user is authenticated.&quot;&quot;&quot;</span>
</span><span class='line'>        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">authenticated</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">is_anonymous</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="sd">&quot;&quot;&quot;False, as anonymous users aren&#39;t supported.&quot;&quot;&quot;</span>
</span><span class='line'>        <span class="k">return</span> <span class="bp">False</span>
</span></code></pre></td></tr></table></div></figure>


<a name="The..code.user_loader..code."></a>
<h3>The <code>user_loader</code></h3>

<p>Flask-login also requires you to define a &ldquo;user_loader&rdquo; function which, given a user ID, returns the associated user object.</p>

<p><strong>Simple:</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c">#!py</span>
</span><span class='line'><span class="nd">@login_manager.user_loader</span>
</span><span class='line'><span class="k">def</span> <span class="nf">user_loader</span><span class="p">(</span><span class="n">user_id</span><span class="p">):</span>
</span><span class='line'>    <span class="sd">&quot;&quot;&quot;Given *user_id*, return the associated User object.</span>
</span><span class='line'>
</span><span class='line'><span class="sd">    :param unicode user_id: user_id (email) user to retrieve</span>
</span><span class='line'><span class="sd">    &quot;&quot;&quot;</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">User</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">user_id</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>@login_manager.user_loader</code> piece tells Flask-login how to load users given an id. I put this function in the file with all my routes defined, as that&rsquo;s where it&rsquo;s used.</p>

<a name="The..code..reports..code..Endpoint"></a>
<h3>The <code>/reports</code> Endpoint</h3>

<p>Now, I could create a <code>/reports</code> endpoint that required authentication. Here&rsquo;s what the code for that endpoint looks like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c">#!py</span>
</span><span class='line'><span class="nd">@bull.route</span><span class="p">(</span><span class="s">&#39;/reports&#39;</span><span class="p">)</span>
</span><span class='line'><span class="nd">@login_required</span>
</span><span class='line'><span class="k">def</span> <span class="nf">reports</span><span class="p">():</span>
</span><span class='line'>    <span class="sd">&quot;&quot;&quot;Run and display various analytics reports.&quot;&quot;&quot;</span>
</span><span class='line'>    <span class="n">products</span> <span class="o">=</span> <span class="n">Product</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
</span><span class='line'>    <span class="n">purchases</span> <span class="o">=</span> <span class="n">Purchase</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
</span><span class='line'>    <span class="n">purchases_by_day</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">purchase</span> <span class="ow">in</span> <span class="n">purchases</span><span class="p">:</span>
</span><span class='line'>        <span class="n">purchase_date</span> <span class="o">=</span> <span class="n">purchase</span><span class="o">.</span><span class="n">sold_at</span><span class="o">.</span><span class="n">date</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">&#39;%m-</span><span class="si">%d</span><span class="s">&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">purchase_date</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">purchases_by_day</span><span class="p">:</span>
</span><span class='line'>            <span class="n">purchases_by_day</span><span class="p">[</span><span class="n">purchase_date</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;units&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="s">&#39;sales&#39;</span><span class="p">:</span> <span class="mf">0.0</span><span class="p">}</span>
</span><span class='line'>        <span class="n">purchases_by_day</span><span class="p">[</span><span class="n">purchase_date</span><span class="p">][</span><span class="s">&#39;units&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span class='line'>        <span class="n">purchases_by_day</span><span class="p">[</span><span class="n">purchase_date</span><span class="p">][</span><span class="s">&#39;sales&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="n">purchase</span><span class="o">.</span><span class="n">product</span><span class="o">.</span><span class="n">price</span>
</span><span class='line'>    <span class="n">purchase_days</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">purchases_by_day</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
</span><span class='line'>    <span class="n">units</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">purchases</span><span class="p">)</span>
</span><span class='line'>    <span class="n">total_sales</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">([</span><span class="n">p</span><span class="o">.</span><span class="n">product</span><span class="o">.</span><span class="n">price</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">purchases</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span>
</span><span class='line'>            <span class="s">&#39;reports.html&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="n">products</span><span class="o">=</span><span class="n">products</span><span class="p">,</span>
</span><span class='line'>            <span class="n">purchase_days</span><span class="o">=</span><span class="n">purchase_days</span><span class="p">,</span>
</span><span class='line'>            <span class="n">purchases</span><span class="o">=</span><span class="n">purchases</span><span class="p">,</span>
</span><span class='line'>            <span class="n">purchases_by_day</span><span class="o">=</span><span class="n">purchases_by_day</span><span class="p">,</span>
</span><span class='line'>            <span class="n">units</span><span class="o">=</span><span class="n">units</span><span class="p">,</span>
</span><span class='line'>            <span class="n">total_sales</span><span class="o">=</span><span class="n">total_sales</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>You&rsquo;ll notice that most of the code is unrelated to authentication, which is just how it should be. The function assumes, due to the decorator, the user has already been authenticated and is thus authorized to see this data. There&rsquo;s only one problem: How does a user become &ldquo;authenticated&rdquo;?</p>

<a name="Login.and.Logout"></a>
<h3>Login and Logout</h3>

<p>Through a <code>/login</code> endpoint, of course! Both <code>/login</code> and <code>/logout</code> are straightforward and can be pulled almost verbatim from the Flask-login documentation:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c">#!py</span>
</span><span class='line'><span class="nd">@bull.route</span><span class="p">(</span><span class="s">&quot;/login&quot;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">&quot;GET&quot;</span><span class="p">,</span> <span class="s">&quot;POST&quot;</span><span class="p">])</span>
</span><span class='line'><span class="k">def</span> <span class="nf">login</span><span class="p">():</span>
</span><span class='line'>    <span class="sd">&quot;&quot;&quot;For GET requests, display the login form. For POSTS, login the current user</span>
</span><span class='line'><span class="sd">    by processing the form.&quot;&quot;&quot;</span>
</span><span class='line'>    <span class="k">print</span> <span class="n">db</span>
</span><span class='line'>    <span class="n">form</span> <span class="o">=</span> <span class="n">LoginForm</span><span class="p">()</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">validate_on_submit</span><span class="p">():</span>
</span><span class='line'>        <span class="n">user</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">form</span><span class="o">.</span><span class="n">email</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">user</span><span class="p">:</span>
</span><span class='line'>            <span class="k">if</span> <span class="n">bcrypt</span><span class="o">.</span><span class="n">check_password_hash</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">password</span><span class="p">,</span> <span class="n">form</span><span class="o">.</span><span class="n">password</span><span class="o">.</span><span class="n">data</span><span class="p">):</span>
</span><span class='line'>                <span class="n">user</span><span class="o">.</span><span class="n">authenticated</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>                <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="n">user</span><span class="p">)</span>
</span><span class='line'>                <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><span class='line'>                <span class="n">login_user</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">remember</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</span><span class='line'>                <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">&quot;bull.reports&quot;</span><span class="p">))</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&quot;login.html&quot;</span><span class="p">,</span> <span class="n">form</span><span class="o">=</span><span class="n">form</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@bull.route</span><span class="p">(</span><span class="s">&quot;/logout&quot;</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">&quot;GET&quot;</span><span class="p">])</span>
</span><span class='line'><span class="nd">@login_required</span>
</span><span class='line'><span class="k">def</span> <span class="nf">logout</span><span class="p">():</span>
</span><span class='line'>    <span class="sd">&quot;&quot;&quot;Logout the current user.&quot;&quot;&quot;</span>
</span><span class='line'>    <span class="n">user</span> <span class="o">=</span> <span class="n">current_user</span>
</span><span class='line'>    <span class="n">user</span><span class="o">.</span><span class="n">authenticated</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>    <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="n">user</span><span class="p">)</span>
</span><span class='line'>    <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><span class='line'>    <span class="n">logout_user</span><span class="p">()</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&quot;logout.html&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>You&rsquo;ll notice we update the <code>User</code> object in the database once they are authenticated. This is due to the fact that, from one request to the next, a new instance of the <code>User</code> object is created each time, so we need a place to store the information that the user already authenticated. Ditto for logging out.</p>

<a name="Creating.an.Admin.User"></a>
<h3>Creating an Admin User</h3>

<p>Much like Django&rsquo;s <code>manage.py</code>, I needed a way to create a single admin user with the proper login credentials. I couldn&rsquo;t just add a row to the database manually, since the password is stored as a salted hash (rather than plain-text, which would be stupid from a security standpoint). I created the following script, <code>create_user.py</code>, to do just that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c">#!/usr/bin/env python</span>
</span><span class='line'><span class="sd">&quot;&quot;&quot;Create a new admin user able to view the /reports endpoint.&quot;&quot;&quot;</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">getpass</span> <span class="kn">import</span> <span class="n">getpass</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">sys</span>
</span><span class='line'>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">current_app</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">bull</span> <span class="kn">import</span> <span class="n">app</span><span class="p">,</span> <span class="n">bcrypt</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">bull.models</span> <span class="kn">import</span> <span class="n">User</span><span class="p">,</span> <span class="n">db</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
</span><span class='line'>    <span class="sd">&quot;&quot;&quot;Main entry point for script.&quot;&quot;&quot;</span>
</span><span class='line'>    <span class="k">with</span> <span class="n">app</span><span class="o">.</span><span class="n">app_context</span><span class="p">():</span>
</span><span class='line'>        <span class="n">db</span><span class="o">.</span><span class="n">metadata</span><span class="o">.</span><span class="n">create_all</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">engine</span><span class="p">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">User</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
</span><span class='line'>            <span class="k">print</span> <span class="s">&#39;A user already exists! Create another? (y/n):&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="n">create</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">()</span>
</span><span class='line'>            <span class="k">if</span> <span class="n">create</span> <span class="o">==</span> <span class="s">&#39;n&#39;</span><span class="p">:</span>
</span><span class='line'>                <span class="k">return</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">print</span> <span class="s">&#39;Enter email address: &#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="n">email</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">()</span>
</span><span class='line'>        <span class="n">password</span> <span class="o">=</span> <span class="n">getpass</span><span class="p">()</span>
</span><span class='line'>        <span class="k">assert</span> <span class="n">password</span> <span class="o">==</span> <span class="n">getpass</span><span class="p">(</span><span class="s">&#39;Password (again):&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">user</span> <span class="o">=</span> <span class="n">User</span><span class="p">(</span><span class="n">email</span><span class="o">=</span><span class="n">email</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="n">bcrypt</span><span class="o">.</span><span class="n">generate_password_hash</span><span class="p">(</span><span class="n">password</span><span class="p">))</span>
</span><span class='line'>        <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="n">user</span><span class="p">)</span>
</span><span class='line'>        <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><span class='line'>        <span class="k">print</span> <span class="s">&#39;User added.&#39;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">main</span><span class="p">())</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, I had a way to cordon off a section of the sales site to display sales data for an admin user. In my case, I only needed a single user, but Flask-login obviously supports many users at once.</p>

<a name="The.Flask.Ecosystem"></a>
<h2>The Flask Ecosystem</h2>

<p>My ability to quickly add this functionality to the site speaks to the rich ecosystem of Flask extensions that exist. Recently, I was looking to create a web application that had, among other things, a forum. Django has all sorts of complex forum applications you can get working with a good deal of effort, but none of them work well with the authentication application I had chosen; the two applications had no reason to be coupled together, but were.</p>

<p>Flask, on the other hand, makes it easy to compose orthogonal applications into a larger, more complex one in much the same way functions are composed in functional languages. Take, for example, <a href="https://github.com/akprasad/flask-forum">flask-forum</a>.
It uses the following Flask extensions in creating the forum:</p>

<ul>
<li>Flask-Admin for database management</li>
<li>Flask-Assets for asset management</li>
<li>Flask-DebugToolbar for debugging and profiling.</li>
<li>Flask-Markdown for forum posts</li>
<li>Flask-Script for basic commands</li>
<li>Flask-Security for authentication</li>
<li>Flask-SQLAlchemy for database queries</li>
<li>Flask-WTF for forms</li>
</ul>


<p>With a list that long, it&rsquo;s almost surprising that all of the applications are able to work together without creating dependencies on one another (or, rather, it&rsquo;s amazing if you&rsquo;re coming from Django), but Flask extensions usually follow the Unix philosophy of &ldquo;do one thing well&rdquo;. I&rsquo;ve yet to encounter a Flask extension that I would consider &ldquo;bloated&rdquo;.</p>

<a name="Wrapping.Up"></a>
<h2>Wrapping Up</h2>

<p>While my use case and implementation were rather simple, the great part about Flask is that it makes simple things simple. If something seems like it should be easy to do and not take much time, with Flask, this is usually true. I was able to add an authenticated admin section of my payment processor in under an hour, and there was no magic involved. I knew how everything worked and fit together.</p>

<p>And that&rsquo;s a powerful concept: no magic. While many web frameworks pride themselves on how little the developer has to do to create an application, they fail to realize that the developer understands only what he writes and uses, and they might be doing developers a disservice by hiding so much. Flask puts it all in the open, and in the process, allows the functional composition of applications that Django set out to create.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Primer on Jinja Templating]]></title>
    <link href="https://realpython.com/blog/python/primer-on-jinja-templating/"/>
    <updated>2014-03-03T08:08:15-08:00</updated>
    <id>https://realpython.com/blog/python/primer-on-jinja-templating</id>
    <content type="html"><![CDATA[<p><img src="https://raw.githubusercontent.com/mjhea0/thinkful-mentor/master/python/jinja/images/jinja2.png" alt="jinga2" /></p>

<p>Right out of the box, Flask includes the powerful <a href="http://jinja.pocoo.org/docs/">Jinja</a> templating language. It&rsquo;s modeled after Django templates (but it renders much faster) and, although, Flask does not force you to use any templating language, it assumes that you&rsquo;ll be using Jinja since it does come pre-installed.</p>

<p>For those who have not been exposed to a templating language before, such languages essentially contain variables as well as some programming logic, which when evaluated (or rendered into HTML) are replaced with <strong>actual</strong> values. The variables and/or logic are placed between tags or delimiters. For example, Jinja templates use <code>{% ... %}</code> for expressions or logic (like for loops), while <code>{{ ... }}</code> are used for outputting the results of an expression or a variable to the end user. The latter tag, when rendered, is replaced with a value or values, and are seen by the end user.</p>

<blockquote><p>Jinja Templates are just .html files. By convention they live in the &ldquo;/templates&rdquo; directory in a Flask project. If you&rsquo;re familiar with <a href="http://docs.python.org/2/library/stdtypes.html#string-formatting-operations">string formatting or interpolation</a>, templating languages follow a similar type of logic &ndash; just on the scale of an entire HTML page.</p></blockquote>

<a name="Quick.Examples"></a>
<h2>Quick Examples</h2>

<p>Make sure you have Jinja installed before running these examples &ndash; <code>pip install jinja2</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>&gt;&gt;&gt; from jinja2 import Template
</span><span class='line'>&gt;&gt;&gt; <span class="nv">t</span> <span class="o">=</span> Template<span class="o">(</span><span class="s2">&quot;Hello {{ something }}!&quot;</span><span class="o">)</span>
</span><span class='line'>&gt;&gt;&gt; t.render<span class="o">(</span><span class="nv">something</span><span class="o">=</span><span class="s2">&quot;World&quot;</span><span class="o">)</span>
</span><span class='line'>u<span class="s1">&#39;Hello World!&#39;</span>
</span><span class='line'>&gt;&gt;&gt;
</span><span class='line'>&gt;&gt;&gt; <span class="nv">t</span> <span class="o">=</span> Template<span class="o">(</span><span class="s2">&quot;My favorite numbers: {% for n in range(1,10) %}{{n}} &quot;</span> <span class="s2">&quot;{% endfor %}&quot;</span><span class="o">)</span>
</span><span class='line'>&gt;&gt;&gt; t.render<span class="o">()</span>
</span><span class='line'>u<span class="s1">&#39;My favorite numbers: 1 2 3 4 5 6 7 8 9 &#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice how the actual output rendered to the user falls within the <code></code> tags.</p>

<a name="Flask.Examples"></a>
<h2>Flask Examples</h2>

<p>The code can be found <a href="https://github.com/mjhea0/thinkful-mentor/tree/master/python/jinja/flask_example">here</a>.</p>

<p>Create the following project structure:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>├── requirements.txt
</span><span class='line'>├── run.py
</span><span class='line'>└── templates
</span></code></pre></td></tr></table></div></figure>


<p>Activate a virtualenv then install flask:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>pip install flask
</span></code></pre></td></tr></table></div></figure>


<p>Add the following code to <em>run.py</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><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><span class='line'><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><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&quot;/&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">template_test</span><span class="p">():</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;template.html&#39;</span><span class="p">,</span> <span class="n">my_string</span><span class="o">=</span><span class="s">&quot;Wheeeee!&quot;</span><span class="p">,</span> <span class="n">my_list</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><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>
</span><span class='line'>    <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">debug</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here we are establishing the route <code>/</code>, which renders the template <em>template.html</em> via the function <code>render_template()</code>. This function must have a template name. Optionally, you can pass in arguments to the template, like in the example &ndash; <code>my_string</code> and <code>my_list</code>.</p>

<p>Add the template:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>  <span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>Flask Template Example<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">name=</span><span class="s">&quot;viewport&quot;</span> <span class="na">content=</span><span class="s">&quot;width=device-width, initial-scale=1.0&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">&quot;http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css&quot;</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">media=</span><span class="s">&quot;screen&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;style </span><span class="na">type=</span><span class="s">&quot;text/css&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nc">.container</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">max-width</span><span class="o">:</span> <span class="m">500px</span><span class="p">;</span>
</span><span class='line'>        <span class="k">padding-top</span><span class="o">:</span> <span class="m">100px</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="nt">&lt;/style&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;p&gt;</span>My string: {{my_string}}<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>      <span class="nt">&lt;p&gt;</span>Value from the list: {{my_list[3]}}<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>      <span class="nt">&lt;p&gt;</span>Loop through the list:<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>      <span class="nt">&lt;ul&gt;</span>
</span><span class='line'>        {% for n in my_list %}
</span><span class='line'>        <span class="nt">&lt;li&gt;</span>{{n}}<span class="nt">&lt;/li&gt;</span>
</span><span class='line'>        {% endfor %}
</span><span class='line'>      <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;http://code.jquery.com/jquery-1.10.2.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Save this as <em>template.html</em> in the templates directory. Notice the template tags. Can you guess the output before you run the app?</p>

<p>Run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python run.py
</span></code></pre></td></tr></table></div></figure>


<p>You should see:</p>

<p><img src="https://raw.githubusercontent.com/mjhea0/thinkful-mentor/master/python/jinja/images/flask-jinja.png" alt="flask-jinja" /></p>

<blockquote><p>It&rsquo;s worth noting that Jinja only supports a few <a href="http://jinja.pocoo.org/docs/templates/#list-of-control-structures">control structures</a> &ndash; <code>if</code>-statements and <code>for</code>-loops are the two primary structures. The syntax is similar to Python, differing in that no colon is required and that termination of the block is done using an <code>endif</code> or <code>endfor</code> instead of by whitespace. You can also complete the logic within your controller or views and then pass each value to the template using the template tags. However, it is much easier to perform such logic within the templates themselves.</p></blockquote>

<a name="Inheritance"></a>
<h2>Inheritance</h2>

<p>Templates usually take advantage of <a href="http://jinja.pocoo.org/docs/templates/#template-inheritance">inheritance</a>, which includes a single base template that defines the basic structure of all subsequent child templates. You use the tags <code>{% extends %}</code> and <code>{% block %}</code> to implement inheritance.</p>

<p>The use case for this is simple: <em>as your application grows, and you continue adding new templates, you will need to keep common code (like an HTML navigation bar, Javascript libraries, CSS stylesheets, and so forth) in sync, which can be a lot of work.</em> Using inheritance, we can move those common pieces to a parent template so that we can create or edit such code once and all child templates will inherent that code.</p>

<blockquote><p>You should always add as much recurring code as possible to your base template to save yourself time in the future, which will far outweigh the initial time investment.</p></blockquote>

<p>Let&rsquo;s add inheritance to our example.</p>

<p>Create the base (or parent) template:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>  <span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>Flask Template Example<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">name=</span><span class="s">&quot;viewport&quot;</span> <span class="na">content=</span><span class="s">&quot;width=device-width, initial-scale=1.0&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">&quot;http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css&quot;</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">media=</span><span class="s">&quot;screen&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;style </span><span class="na">type=</span><span class="s">&quot;text/css&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nc">.container</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">max-width</span><span class="o">:</span> <span class="m">500px</span><span class="p">;</span>
</span><span class='line'>        <span class="k">padding-top</span><span class="o">:</span> <span class="m">100px</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="nt">h2</span> <span class="p">{</span><span class="k">color</span><span class="o">:</span> <span class="nb">red</span><span class="p">;}</span>
</span><span class='line'>    <span class="nt">&lt;/style&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;h2&gt;</span>This is part of my base template<span class="nt">&lt;/h2&gt;</span>
</span><span class='line'>      <span class="nt">&lt;br&gt;</span>
</span><span class='line'>      {% block content %}{% endblock %}
</span><span class='line'>      <span class="nt">&lt;br&gt;</span>
</span><span class='line'>      <span class="nt">&lt;h2&gt;</span>This is part of my base template<span class="nt">&lt;/h2&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;http://code.jquery.com/jquery-1.10.2.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Save this as <em>layout.html</em>.</p>

<p>Did you notice the <code>{% block %}</code> tags? This defines a block (or area) that child templates can fill in. Further, this just informs the templating engine that a child template may override the block of the template.</p>

<blockquote><p>Think of these as placeholders to be filled in by code from the child template(s).</p></blockquote>

<p>Let&rsquo;s do that.</p>

<p>Update <em>template.html</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{% extends &quot;layout.html&quot; %}
</span><span class='line'>{% block content %}
</span><span class='line'>  <span class="nt">&lt;h3&gt;</span> This is the start of my child template<span class="nt">&lt;/h3&gt;</span>
</span><span class='line'>  <span class="nt">&lt;br&gt;</span>
</span><span class='line'>  <span class="nt">&lt;p&gt;</span>My string: {{my_string}}<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>  <span class="nt">&lt;p&gt;</span>Value from the list: {{my_list[3]}}<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>  <span class="nt">&lt;p&gt;</span>Loop through the list:<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>  <span class="nt">&lt;ul&gt;</span>
</span><span class='line'>    {% for n in my_list %}
</span><span class='line'>    <span class="nt">&lt;li&gt;</span>{{n}}<span class="nt">&lt;/li&gt;</span>
</span><span class='line'>    {% endfor %}
</span><span class='line'>  <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>  <span class="nt">&lt;h3&gt;</span> This is the end of my child template<span class="nt">&lt;/h3&gt;</span>
</span><span class='line'>{% endblock %}
</span></code></pre></td></tr></table></div></figure>


<p>So, the <code>{% extends %}</code> informs the templating engine that this template &ldquo;extends&rdquo; another template, <em>layout.html</em>. This establishes the link between the templates, in other words.</p>

<p>Run it. You should see:</p>

<p><img src="https://raw.githubusercontent.com/mjhea0/thinkful-mentor/master/python/jinja/images/flask-jinja2.png" alt="flask-jinja2" /></p>

<p>One common use case is to add a navigation bar.</p>

<p>Add the following code to the base template, just after the opening <code>&lt;body&gt;</code> tag:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;nav</span> <span class="na">class=</span><span class="s">&quot;navbar navbar-inverse&quot;</span> <span class="na">role=</span><span class="s">&quot;navigation&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;container-fluid&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;navbar-header&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;button</span> <span class="na">type=</span><span class="s">&quot;button&quot;</span> <span class="na">class=</span><span class="s">&quot;navbar-toggle&quot;</span> <span class="na">data-toggle=</span><span class="s">&quot;collapse&quot;</span> <span class="na">data-target=</span><span class="s">&quot;#bs-example-navbar-collapse-1&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;sr-only&quot;</span><span class="nt">&gt;</span>Toggle navigation<span class="nt">&lt;/span&gt;</span>
</span><span class='line'>        <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;icon-bar&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>        <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;icon-bar&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>        <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;icon-bar&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/button&gt;</span>
</span><span class='line'>      <span class="nt">&lt;a</span> <span class="na">class=</span><span class="s">&quot;navbar-brand&quot;</span> <span class="na">href=</span><span class="s">&quot;/&quot;</span><span class="nt">&gt;</span>Jinja!<span class="nt">&lt;/a&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;collapse navbar-collapse&quot;</span> <span class="na">id=</span><span class="s">&quot;bs-example-navbar-collapse-1&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">&quot;nav navbar-nav&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">&quot;active&quot;</span><span class="nt">&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Link<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Link<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>      <span class="nt">&lt;form</span> <span class="na">class=</span><span class="s">&quot;navbar-form navbar-left&quot;</span> <span class="na">role=</span><span class="s">&quot;search&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;form-group&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>          <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">class=</span><span class="s">&quot;form-control&quot;</span> <span class="na">placeholder=</span><span class="s">&quot;Search&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;button</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">class=</span><span class="s">&quot;btn btn-default&quot;</span><span class="nt">&gt;</span>Submit<span class="nt">&lt;/button&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/form&gt;</span>
</span><span class='line'>      <span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">&quot;nav navbar-nav navbar-right&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Link<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">&quot;dropdown&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>          <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span> <span class="na">class=</span><span class="s">&quot;dropdown-toggle&quot;</span> <span class="na">data-toggle=</span><span class="s">&quot;dropdown&quot;</span><span class="nt">&gt;</span>Dropdown <span class="nt">&lt;b</span> <span class="na">class=</span><span class="s">&quot;caret&quot;</span><span class="nt">&gt;&lt;/b&gt;&lt;/a&gt;</span>
</span><span class='line'>          <span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">&quot;dropdown-menu&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Action<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>            <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Another action<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>            <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Something else here<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>            <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">&quot;divider&quot;</span><span class="nt">&gt;&lt;/li&gt;</span>
</span><span class='line'>            <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Separated link<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>          <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/li&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span><span class="c">&lt;!-- /.navbar-collapse --&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span><span class="c">&lt;!-- /.container-fluid --&gt;</span>
</span><span class='line'><span class="nt">&lt;/nav&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now every single child template that extends from the base will have the same navigation bar. To steal a line from Java philosophy: &ldquo;Write once, use anywhere.&rdquo;</p>

<p><img src="https://raw.githubusercontent.com/mjhea0/thinkful-mentor/master/python/jinja/images/flask-jinja3.png" alt="flask-jinja3" /></p>

<a name="Super.Blocks"></a>
<h2>Super Blocks</h2>

<p>If you need to render a block from the base template, use a <a href="http://jinja.pocoo.org/docs/templates/#super-blocks">super block</a>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{{ super() }}
</span></code></pre></td></tr></table></div></figure>


<p>Add a footer to the base template:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&lt;</span><span class="n">div</span> <span class="n">class</span><span class="o">=</span><span class="s">&quot;footer&quot;</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="p">{</span><span class="o">%</span> <span class="n">block</span> <span class="n">footer</span> <span class="o">%</span><span class="p">}</span>
</span><span class='line'>    <span class="n">Watch</span><span class="err">!</span> <span class="n">This</span> <span class="n">will</span> <span class="n">be</span> <span class="n">added</span> <span class="n">to</span> <span class="n">my</span> <span class="n">base</span> <span class="ow">and</span> <span class="n">child</span> <span class="n">templates</span> <span class="n">using</span> <span class="n">the</span> <span class="nb">super</span> <span class="n">powerful</span> <span class="nb">super</span> <span class="n">block</span><span class="err">!</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="n">br</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="n">br</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="p">{</span><span class="o">%</span> <span class="n">endblock</span> <span class="o">%</span><span class="p">}</span>
</span><span class='line'><span class="o">&lt;/</span><span class="n">div</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Updated code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">&lt;</span><span class="err">!</span><span class="n">DOCTYPE</span> <span class="n">html</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="n">head</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="n">title</span><span class="o">&gt;</span><span class="n">Flask</span> <span class="n">Template</span> <span class="n">Example</span><span class="o">&lt;/</span><span class="n">title</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="n">meta</span> <span class="n">name</span><span class="o">=</span><span class="s">&quot;viewport&quot;</span> <span class="n">content</span><span class="o">=</span><span class="s">&quot;width=device-width, initial-scale=1.0&quot;</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="n">link</span> <span class="n">href</span><span class="o">=</span><span class="s">&quot;http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css&quot;</span> <span class="n">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span> <span class="n">media</span><span class="o">=</span><span class="s">&quot;screen&quot;</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="n">style</span> <span class="nb">type</span><span class="o">=</span><span class="s">&quot;text/css&quot;</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">.</span><span class="n">container</span> <span class="p">{</span>
</span><span class='line'>        <span class="nb">max</span><span class="o">-</span><span class="n">width</span><span class="p">:</span> <span class="mi">500</span><span class="n">px</span><span class="p">;</span>
</span><span class='line'>        <span class="n">padding</span><span class="o">-</span><span class="n">top</span><span class="p">:</span> <span class="mi">100</span><span class="n">px</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="n">h2</span> <span class="p">{</span><span class="n">color</span><span class="p">:</span> <span class="n">red</span><span class="p">;}</span>
</span><span class='line'>    <span class="o">&lt;/</span><span class="n">style</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">&lt;/</span><span class="n">head</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="n">body</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="n">div</span> <span class="n">class</span><span class="o">=</span><span class="s">&quot;container&quot;</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="n">h2</span><span class="o">&gt;</span><span class="n">This</span> <span class="ow">is</span> <span class="n">part</span> <span class="n">of</span> <span class="n">my</span> <span class="n">base</span> <span class="n">template</span><span class="o">&lt;/</span><span class="n">h2</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="n">br</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="p">{</span><span class="o">%</span> <span class="n">block</span> <span class="n">content</span> <span class="o">%</span><span class="p">}{</span><span class="o">%</span> <span class="n">endblock</span> <span class="o">%</span><span class="p">}</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="n">br</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="n">h2</span><span class="o">&gt;</span><span class="n">This</span> <span class="ow">is</span> <span class="n">part</span> <span class="n">of</span> <span class="n">my</span> <span class="n">base</span> <span class="n">template</span><span class="o">&lt;/</span><span class="n">h2</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="n">br</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="n">div</span> <span class="n">class</span><span class="o">=</span><span class="s">&quot;footer&quot;</span><span class="o">&gt;</span>
</span><span class='line'>        <span class="p">{</span><span class="o">%</span> <span class="n">block</span> <span class="n">footer</span> <span class="o">%</span><span class="p">}</span>
</span><span class='line'>          <span class="n">Watch</span><span class="err">!</span> <span class="n">This</span> <span class="n">will</span> <span class="n">be</span> <span class="n">added</span> <span class="n">to</span> <span class="n">my</span> <span class="n">base</span> <span class="ow">and</span> <span class="n">child</span> <span class="n">templates</span> <span class="n">using</span> <span class="n">the</span> <span class="nb">super</span> <span class="n">powerful</span> <span class="nb">super</span> <span class="n">block</span><span class="err">!</span>
</span><span class='line'>          <span class="o">&lt;</span><span class="n">br</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="o">&lt;</span><span class="n">br</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="o">&lt;</span><span class="n">br</span><span class="o">&gt;</span>
</span><span class='line'>        <span class="p">{</span><span class="o">%</span> <span class="n">endblock</span> <span class="o">%</span><span class="p">}</span>
</span><span class='line'>      <span class="o">&lt;/</span><span class="n">div</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;/</span><span class="n">div</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;http://code.jquery.com/jquery-1.10.2.min.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">&lt;/</span><span class="n">body</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;/</span><span class="n">html</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Run the app. You should see that the footer is just part of the base:</p>

<p><img src="https://raw.githubusercontent.com/mjhea0/thinkful-mentor/master/python/jinja/images/jinja-super.png" alt="jinja-super" /></p>

<p>Now, add the super block to <em>template.html</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{% extends &quot;layout.html&quot; %}
</span><span class='line'>{% block content %}
</span><span class='line'>  <span class="nt">&lt;h3&gt;</span> This is the start of my child template<span class="nt">&lt;/h3&gt;</span>
</span><span class='line'>  <span class="nt">&lt;br&gt;</span>
</span><span class='line'>  <span class="nt">&lt;p&gt;</span>My string: {{my_string}}<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>  <span class="nt">&lt;p&gt;</span>Value from the list: {{my_list[3]}}<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>  <span class="nt">&lt;p&gt;</span>Loop through the list:<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>  <span class="nt">&lt;ul&gt;</span>
</span><span class='line'>    {% for n in my_list %}
</span><span class='line'>    <span class="nt">&lt;li&gt;</span>{{n}}<span class="nt">&lt;/li&gt;</span>
</span><span class='line'>    {% endfor %}
</span><span class='line'>  <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>  <span class="nt">&lt;h3&gt;</span> This is the end of my child template<span class="nt">&lt;/h3&gt;</span>
</span><span class='line'>  {% block footer %}
</span><span class='line'>  {{super()}}
</span><span class='line'>  {% endblock %}
</span><span class='line'>{% endblock %}
</span></code></pre></td></tr></table></div></figure>


<p>Check it out in your browser:</p>

<p><img src="https://raw.githubusercontent.com/mjhea0/thinkful-mentor/master/python/jinja/images/jinja-super2.png" alt="jinja-super2" /></p>

<p>The super block is used for common code that both the parent and child templates share, such as the <code>&lt;title&gt;</code> where both templates share part of the title, then you would just need to pass in the other part. Or for a heading.</p>

<p>For example:</p>

<p><strong>Parent</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{% block heading %}
</span><span class='line'>  <span class="nt">&lt;h1&gt;</span>{% block page %}{% endblock %} - Flask Super Example<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>{% endblock %}
</span></code></pre></td></tr></table></div></figure>


<p><strong>Child</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{% block page %}Home{% endblock %}
</span><span class='line'>{% block heading %}
</span><span class='line'>  {{ super() }}
</span><span class='line'>{% endblock %}
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s see that in action:</p>

<p><img src="https://raw.githubusercontent.com/mjhea0/thinkful-mentor/master/python/jinja/images/jinja-super3.png" alt="jinja-super3" /></p>

<p>See what happens when you remove <code>{% block page %}Home{% endblock %}</code> from the child template</p>

<blockquote><p><strong>Challenge</strong>: Try to update the <code>&lt;title&gt;</code> using the same method with the super block. Check out my code if you need help.</p></blockquote>

<p>Instead of hard coding the name of the template, let&rsquo;s make it dynamic.</p>

<p>Update the two code snippets in <em>template.html</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{% block title %}{{title}}{% endblock %}
</span></code></pre></td></tr></table></div></figure>


<p>and</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{% block page %}{{title}}{% endblock %}
</span></code></pre></td></tr></table></div></figure>


<p>Now we need to pass in a <code>title</code> variable to our template from our controller, <em>run.py</em>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&quot;/&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">template_test</span><span class="p">():</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;template.html&#39;</span><span class="p">,</span> <span class="n">my_string</span><span class="o">=</span><span class="s">&quot;Wheeeee!&quot;</span><span class="p">,</span> <span class="n">my_list</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">],</span> <span class="n">title</span><span class="o">=</span><span class="s">&quot;Home&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Test this out.</p>

<a name="Macros"></a>
<h2>Macros</h2>

<p>In Jinja, we can use macros to abstract commonly used code snippets that are used over and over to not repeat ourselves. For example, it&rsquo;s common to highlight the link of the current page on the navigation bar (active link). Otherwise, we&rsquo;d have to use <code>if</code>/<code>elif</code>/<code>else</code> statements to determine the active link. Using <a href="http://jinja.pocoo.org/docs/templates/#macros">macros</a>, we can abstract out such code into a separate file.</p>

<p>Add a <em>macros.html</em> file to the &ldquo;templates&rdquo; directory:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{% macro nav_link(endpoint, name) %}
</span><span class='line'>{% if request.endpoint.endswith(endpoint) %}
</span><span class='line'>  <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">&quot;active&quot;</span><span class="nt">&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;{{ url_for(endpoint) }}&quot;</span><span class="nt">&gt;</span>{{name}}<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>{% else %}
</span><span class='line'>  <span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;{{ url_for(endpoint) }}&quot;</span><span class="nt">&gt;</span>{{name}}<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>{% endif %}
</span><span class='line'>{% endmacro %}
</span></code></pre></td></tr></table></div></figure>


<p>Here, we&rsquo;re using Flask&rsquo;s <a href="http://flask.pocoo.org/docs/reqcontext/">request object</a>, which is part of Jinja by default, to check the requested endpoint, then assigning the <code>active</code> class to that endpoint.</p>

<p>pdate the unordered list with the <code>nav navbar-nav</code> class in the base template:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">&quot;nav navbar-nav&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  {{ nav_link(&#39;home&#39;, &#39;Home&#39;) }}
</span><span class='line'>  {{ nav_link(&#39;about&#39;, &#39;About&#39;) }}
</span><span class='line'>  {{ nav_link(&#39;contact&#39;, &#39;Contact Us&#39;) }}
</span><span class='line'><span class="nt">&lt;/ul&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Also, make sure to add the import at the top of the template: <code>{% from "macros.html" import nav_link with context %}</code>.</p>

<p>Notice how we&rsquo;re calling the <code>nav-link</code> macro and passing it two arguments, the <em>endpoint</em> (which comes from our controller) and the <em>text</em> we want displayed.</p>

<p>Finally, let&rsquo;s add three new endpoints to the controller:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&quot;/home&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">home</span><span class="p">():</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;template.html&#39;</span><span class="p">,</span> <span class="n">my_string</span><span class="o">=</span><span class="s">&quot;Wheeeee!&quot;</span><span class="p">,</span> <span class="n">my_list</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">],</span> <span class="n">title</span><span class="o">=</span><span class="s">&quot;Home&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&quot;/about&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">about</span><span class="p">():</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;template.html&#39;</span><span class="p">,</span> <span class="n">my_string</span><span class="o">=</span><span class="s">&quot;Wheeeee!&quot;</span><span class="p">,</span> <span class="n">my_list</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">],</span> <span class="n">title</span><span class="o">=</span><span class="s">&quot;About&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&quot;/contact&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">contact</span><span class="p">():</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;template.html&#39;</span><span class="p">,</span> <span class="n">my_string</span><span class="o">=</span><span class="s">&quot;Wheeeee!&quot;</span><span class="p">,</span> <span class="n">my_list</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">],</span> <span class="n">title</span><span class="o">=</span><span class="s">&quot;Contact Us&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Refresh the page. Test out the links at the top. Does the current page get highlighted? It should.</p>

<p><img src="https://raw.githubusercontent.com/mjhea0/thinkful-mentor/master/python/jinja/images/jinja-macros.png" alt="jinja-macros" /></p>

<a name="Custom.filters"></a>
<h2>Custom filters</h2>

<p>Jinja uses <a href="http://jinja.pocoo.org/docs/templates/#filters">filters</a> to modify variables, mostly for formatting purpose.</p>

<p>For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{{ num | round }}
</span></code></pre></td></tr></table></div></figure>


<p>This will round the <code>num</code> variable. So, if we pass argument <code>num=46.99</code> into the template, <code>47.0</code> will be outputted.</p>

<p>As you can tell, you specify the variable then a pipe (|) followed by the filter. Check out this <a href="http://jinja.pocoo.org/docs/templates/#builtin-filters">link</a> for the list of filters already included within Jinja. In some cases, you can specify optional arguments in parentheses.</p>

<p>For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{{ list|join(&#39;, &#39;) }}
</span></code></pre></td></tr></table></div></figure>


<p>This will join a list by the comma delimiter.</p>

<p>Test this out. Add the following line to <em>template.html</em></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;p&gt;</span>Same list with a filter: {{ my_list|join(&#39;, &#39;) }}<span class="nt">&lt;/p&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, besides the built-in filters, we can create our <a href="http://jinja.pocoo.org/docs/api/#custom-filters">own</a>.</p>

<p>Let&rsquo;s add one of our own. One common example is a custom datetime filter.</p>

<p>Add the following code to our controller after we create the app &ndash; <code>app = Flask(__name__)</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@app.template_filter</span><span class="p">()</span>
</span><span class='line'><span class="k">def</span> <span class="nf">datetimefilter</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s">&#39;%Y/%m/</span><span class="si">%d</span><span class="s"> %H:%M&#39;</span><span class="p">):</span>
</span><span class='line'>    <span class="sd">&quot;&quot;&quot;convert a datetime to a different format.&quot;&quot;&quot;</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">value</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">format</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">app</span><span class="o">.</span><span class="n">jinja_env</span><span class="o">.</span><span class="n">filters</span><span class="p">[</span><span class="s">&#39;datetimefilter&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetimefilter</span>
</span></code></pre></td></tr></table></div></figure>


<p>Using the <code>@app.template_filter()</code> decorator we are registering the <code>datetimefilter()</code> function as a filter.</p>

<blockquote><p>The default name for the filter is just the name of the function; however, you can customize it by passing in an argument to the function &ndash; e.g, <code>@app.template_filter(formatdate)</code>.</p></blockquote>

<p>Next, we are adding the filter to the Jinja environment, making it accessible. Now it&rsquo;s ready for use.</p>

<p>Add the following code to our child template:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;h4&gt;</span>Current date/time: {{ current_time | datetimefilter }}<span class="nt">&lt;/h4&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, just pass in the datetime to our template:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">current_time</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Test.</p>

<p><img src="https://raw.githubusercontent.com/mjhea0/thinkful-mentor/master/python/jinja/images/jinja-filter.png" alt="jinja-filter" /></p>

<a name="Conclusion"></a>
<h2>Conclusion</h2>

<p>That&rsquo;s it. Grab the sample code <a href="https://github.com/mjhea0/thinkful-mentor/tree/master/python/jinja/flask_example">here</a>.</p>

<p>Did I miss anything? Comment below.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Primer on Python Decorators]]></title>
    <link href="https://realpython.com/blog/python/primer-on-python-decorators/"/>
    <updated>2014-02-05T07:43:57-08:00</updated>
    <id>https://realpython.com/blog/python/primer-on-python-decorators</id>
    <content type="html"><![CDATA[<p>Decorators provide a simple syntax for calling <a href="http://en.wikipedia.org/wiki/Higher-order_function">higher-order functions</a>. By definition, a decorator is a function that takes another function and extends the behavior of the latter function without explicitly modifying it. Sounds confusing &ndash; but it&rsquo;s really not, especially after we go over a number of examples.</p>

<p><strong>In this introductory tutorial, we&rsquo;ll look at what decorators are and how to create and use them.</strong></p>

<blockquote><p>You can find all the examples from this article <a href="https://github.com/mjhea0/python-decorators">here</a>.</p></blockquote>

<a name="First.things.first"></a>
<h2>First things first</h2>

<p>Before you can understand decorators, you must first understand &hellip;</p>

<a name="How.functions.work"></a>
<h3>How functions work</h3>

<p>Essentially, <strong>functions return a value based on the given arguments</strong>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">bar</span><span class="p">):</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">bar</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'>
</span><span class='line'><span class="k">print</span> <span class="n">foo</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">==</span> <span class="mi">3</span>
</span></code></pre></td></tr></table></div></figure>


<a name="First.Class.Objects"></a>
<h3>First Class Objects</h3>

<p>In Python, functions are <strong><a href="http://python-history.blogspot.com/2009/02/first-class-everything.html">first-class</a> objects</strong>. This means that functions can be passed around, and used as arguments, just like any other value (e.g, string, int, float).</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">bar</span><span class="p">):</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">bar</span><span class="o">+</span><span class="mi">1</span>
</span><span class='line'>
</span><span class='line'><span class="k">print</span> <span class="n">foo</span>
</span><span class='line'><span class="k">print</span> <span class="n">foo</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
</span><span class='line'><span class="k">print</span> <span class="nb">type</span><span class="p">(</span><span class="n">foo</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">call_foo_with_arg</span><span class="p">(</span><span class="n">foo</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">foo</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">print</span> <span class="n">call_foo_with_arg</span><span class="p">(</span><span class="n">foo</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<a name="Nested.Functions"></a>
<h3>Nested Functions</h3>

<p>Because of the first-class nature of functions in Python, you can <strong>define functions inside other functions</strong>. Such functions are called nested functions.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">parent</span><span class="p">():</span>
</span><span class='line'>  <span class="k">print</span> <span class="s">&quot;Printing from the parent() function.&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">first_child</span><span class="p">():</span>
</span><span class='line'>      <span class="k">return</span> <span class="s">&quot;Printing from the first_child() function.&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">second_child</span><span class="p">():</span>
</span><span class='line'>      <span class="k">return</span> <span class="s">&quot;Printing from the second_child() function.&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">print</span> <span class="n">first_child</span><span class="p">()</span>
</span><span class='line'>  <span class="k">print</span> <span class="n">second_child</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>What happens when you call the <code>parent()</code> function? Think about this for a minute. You should get &hellip;</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>Printing from the parent<span class="o">()</span> <span class="k">function</span>.
</span><span class='line'>Printing from the first_child<span class="o">()</span> <span class="k">function</span>.
</span><span class='line'>Printing from the second_child<span class="o">()</span> <span class="k">function</span>
</span></code></pre></td></tr></table></div></figure>


<p>Try calling the <code>first_child()</code>. You should get an error:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>Traceback <span class="o">(</span>most recent call last<span class="o">)</span>:
</span><span class='line'>File <span class="s2">&quot;decorator3.py&quot;</span>, line 15, in &lt;module&gt;
</span><span class='line'>first_child<span class="o">()</span>
</span><span class='line'>NameError: name <span class="s1">&#39;first_child&#39;</span> is not defined
</span></code></pre></td></tr></table></div></figure>


<p><strong>What have we learned?</strong></p>

<p>Whenever you call <code>parent()</code>, the sibling functions, <code>first_child()</code> and <code>second_child()</code> are also called <em>AND</em>
because of scope, both of the sibling functions are not available (e.g., cannot be called) outside of the parent function.</p>

<a name="Returning.Functions"></a>
<h3>Returning Functions</h3>

<p>Python also allows you to <strong>return functions from other functions</strong>. Let&rsquo;s alter the previous function for this example.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">parent</span><span class="p">(</span><span class="n">num</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">first_child</span><span class="p">():</span>
</span><span class='line'>      <span class="k">return</span> <span class="s">&quot;Printing from the first_child() function.&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">second_child</span><span class="p">():</span>
</span><span class='line'>      <span class="k">return</span> <span class="s">&quot;Printing from the second_child() function.&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">try</span><span class="p">:</span>
</span><span class='line'>      <span class="k">assert</span> <span class="n">num</span> <span class="o">==</span> <span class="mi">10</span>
</span><span class='line'>      <span class="k">return</span> <span class="n">first_child</span>
</span><span class='line'>  <span class="k">except</span> <span class="ne">AssertionError</span><span class="p">:</span>
</span><span class='line'>      <span class="k">return</span> <span class="n">second_child</span>
</span><span class='line'>
</span><span class='line'><span class="n">foo</span> <span class="o">=</span> <span class="n">parent</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
</span><span class='line'><span class="n">bar</span> <span class="o">=</span> <span class="n">parent</span><span class="p">(</span><span class="mi">11</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">print</span> <span class="n">foo</span>
</span><span class='line'><span class="k">print</span> <span class="n">bar</span>
</span><span class='line'>
</span><span class='line'><span class="k">print</span> <span class="n">foo</span><span class="p">()</span>
</span><span class='line'><span class="k">print</span> <span class="n">bar</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>The output of the first two print statements is:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>&lt;<span class="k">function </span>first_child at 0x1004a8c08&gt;
</span><span class='line'>&lt;<span class="k">function </span>second_child at 0x1004a8cf8&gt;
</span></code></pre></td></tr></table></div></figure>


<p>This simply means that <code>foo</code> points to the <code>first_child()</code> function, while <code>bar</code> points to the <code>second_child()</code> function.</p>

<p>The output of the second two functions confirms this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>Printing from the first_child<span class="o">()</span> <span class="k">function</span>.
</span><span class='line'>Printing from the second_child<span class="o">()</span> <span class="k">function</span>.
</span></code></pre></td></tr></table></div></figure>


<p>Finally, did you notice that in example three, we executed the sibling functions within the parent functions &ndash; e.g, <code>second_child()</code>. Meanwhile in this last example, we did not add parenthesis to the sibling functions &ndash; <code>first_child</code> &ndash; when called so that way we can use them in the future. Make sense?</p>

<a name="Now..my.friend..you.are.ready.to.take.on.decorators."></a>
<h2>Now, my friend, you are ready to take on decorators!</h2>

<p>Let&rsquo;s look at two examples &hellip;</p>

<a name="Example.1:"></a>
<h3>Example 1:</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">my_decorator</span><span class="p">(</span><span class="n">some_function</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">wrapper</span><span class="p">():</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">print</span> <span class="s">&quot;Something is happening before some_function() is called.&quot;</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">some_function</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">print</span> <span class="s">&quot;Something is happening after some_function() is called.&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="n">wrapper</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">just_some_function</span><span class="p">():</span>
</span><span class='line'>  <span class="k">print</span> <span class="s">&quot;Wheee!&quot;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">just_some_function</span> <span class="o">=</span> <span class="n">my_decorator</span><span class="p">(</span><span class="n">just_some_function</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">just_some_function</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Can you guess what the output will be? Try.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>Something is happening before some_function<span class="o">()</span> is called.
</span><span class='line'>Wheee!
</span><span class='line'>Something is happening after some_function<span class="o">()</span> is called.
</span></code></pre></td></tr></table></div></figure>


<p>To understand what&rsquo;s going on here, just look back at the four previous examples. We are literally just applying everything learned. <strong>Put simply, decorators wrap a function, modifying its behavior.</strong></p>

<p>Let&rsquo;s take it one step further and add an if statement.</p>

<a name="Example.2:"></a>
<h3>Example 2:</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">my_decorator</span><span class="p">(</span><span class="n">some_function</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">wrapper</span><span class="p">():</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">num</span> <span class="o">=</span> <span class="mi">10</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="n">num</span> <span class="o">==</span> <span class="mi">10</span><span class="p">:</span>
</span><span class='line'>          <span class="k">print</span> <span class="s">&quot;Yes!&quot;</span>
</span><span class='line'>      <span class="k">else</span><span class="p">:</span>
</span><span class='line'>          <span class="k">print</span> <span class="s">&quot;No!&quot;</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">some_function</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">print</span> <span class="s">&quot;Something is happening after some_function() is called.&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="n">wrapper</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">just_some_function</span><span class="p">():</span>
</span><span class='line'> <span class="k">print</span> <span class="s">&quot;Wheee!&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="n">just_some_function</span> <span class="o">=</span> <span class="n">my_decorator</span><span class="p">(</span><span class="n">just_some_function</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">just_some_function</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>This will output in:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>Yes!
</span><span class='line'>Wheee!
</span><span class='line'>Something is happening after some_function<span class="o">()</span> is called.
</span></code></pre></td></tr></table></div></figure>


<a name="Time.for.some.syntactic.sugar."></a>
<h2>Time for some syntactic sugar!</h2>

<p>Python allows you to simplify the calling of decorators using the <code>@</code> symbol (this is called &ldquo;pie&rdquo; syntax):</p>

<a name="Let.s.create.a.module.for.our.decorator:"></a>
<h3>Let&rsquo;s create a module for our decorator:</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">my_decorator</span><span class="p">(</span><span class="n">some_function</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">wrapper</span><span class="p">():</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">num</span> <span class="o">=</span> <span class="mi">10</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="n">num</span> <span class="o">==</span> <span class="mi">10</span><span class="p">:</span>
</span><span class='line'>          <span class="k">print</span> <span class="s">&quot;Yes!&quot;</span>
</span><span class='line'>      <span class="k">else</span><span class="p">:</span>
</span><span class='line'>          <span class="k">print</span> <span class="s">&quot;No!&quot;</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">some_function</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">print</span> <span class="s">&quot;Something is happening after some_function() is called.&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="n">wrapper</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span>
</span><span class='line'>  <span class="n">my_decorator</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Okay. Stay with me. Let&rsquo;s look at how to call the function with the decorator:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">decorator7</span> <span class="kn">import</span> <span class="n">my_decorator</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@my_decorator</span>
</span><span class='line'><span class="k">def</span> <span class="nf">just_some_function</span><span class="p">():</span>
</span><span class='line'>  <span class="k">print</span> <span class="s">&quot;Wheee!&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="n">just_some_function</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>When you run this example, you should get the same output as in the previous one:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>Yes!
</span><span class='line'>Wheee!
</span><span class='line'>Something is happening after some_function<span class="o">()</span> is called.
</span></code></pre></td></tr></table></div></figure>


<p>So, <code>@my_decorator</code> is just an easier way of saying <code>just_some_function = my_decorator(just_some_function)</code>.</p>

<a name="Real.World"></a>
<h2>Real World</h2>

<p>How about a few real world examples &hellip;</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">time</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">timing_function</span><span class="p">(</span><span class="n">some_function</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">&quot;&quot;&quot;</span>
</span><span class='line'><span class="sd">    Outputs the time a function takes</span>
</span><span class='line'><span class="sd">    to execute.</span>
</span><span class='line'><span class="sd">    &quot;&quot;&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">wrapper</span><span class="p">():</span>
</span><span class='line'>        <span class="n">t1</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span><span class='line'>        <span class="n">some_function</span><span class="p">()</span>
</span><span class='line'>        <span class="n">t2</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span><span class='line'>        <span class="k">return</span> <span class="s">&quot;Time it took to run the function: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">((</span><span class="n">t2</span><span class="o">-</span><span class="n">t1</span><span class="p">))</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">wrapper</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@timing_function</span>
</span><span class='line'><span class="k">def</span> <span class="nf">my_function</span><span class="p">():</span>
</span><span class='line'>    <span class="n">num_list</span> <span class="o">=</span> <span class="p">[]</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">10000</span><span class="p">)):</span>
</span><span class='line'>        <span class="n">num_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span><span class='line'>    <span class="k">print</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Sum of all the numbers: &quot;</span> <span class="o">+</span><span class="nb">str</span><span class="p">((</span><span class="nb">sum</span><span class="p">(</span><span class="n">num_list</span><span class="p">)))</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">print</span> <span class="n">my_function</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>This returns the time before you run <code>my_function()</code> as well as the time after. Then we simply subtract the two to see how long it took to run the function.</p>

<p>Run it. Work through the code, line by line. Make sure you understand how it works.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">sleep</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">sleep_decorator</span><span class="p">(</span><span class="n">function</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="sd">&quot;&quot;&quot;</span>
</span><span class='line'><span class="sd">    Limits how fast the function is</span>
</span><span class='line'><span class="sd">    called.</span>
</span><span class='line'><span class="sd">    &quot;&quot;&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">wrapper</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><span class='line'>        <span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">function</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><span class='line'>    <span class="k">return</span> <span class="n">wrapper</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nd">@sleep_decorator</span>
</span><span class='line'><span class="k">def</span> <span class="nf">print_number</span><span class="p">(</span><span class="n">num</span><span class="p">):</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">num</span>
</span><span class='line'>
</span><span class='line'><span class="k">print</span> <span class="n">print_number</span><span class="p">(</span><span class="mi">222</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">6</span><span class="p">):</span>
</span><span class='line'>    <span class="k">print</span> <span class="n">print_number</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This decorator is used for rate limiting. Test it out.</p>

<p>Finally one of the most used decorators in Python is the <code>login_required()</code> decorator, which ensures that a user is logged in/properly authenticated before s/he can access a specific route (<code>/secret</code>, in this case):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">wraps</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">g</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">redirect</span><span class="p">,</span> <span class="n">url_for</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">login_required</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span><span class='line'>    <span class="nd">@wraps</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">decorated_function</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><span class='line'>        <span class="k">if</span> <span class="n">g</span><span class="o">.</span><span class="n">user</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
</span><span class='line'>            <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;login&#39;</span><span class="p">,</span> <span class="nb">next</span><span class="o">=</span><span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="p">))</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">f</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><span class='line'>    <span class="k">return</span> <span class="n">decorated_function</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@app.route</span><span class="p">(</span><span class="s">&#39;/secret&#39;</span><span class="p">)</span>
</span><span class='line'><span class="nd">@login_required</span>
</span><span class='line'><span class="k">def</span> <span class="nf">secret</span><span class="p">():</span>
</span><span class='line'>    <span class="k">pass</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Cheers!</strong></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Python Web Applications With Flask - Part III]]></title>
    <link href="https://realpython.com/blog/python/python-web-applications-with-flask-part-iii/"/>
    <updated>2014-02-02T07:20:06-08:00</updated>
    <id>https://realpython.com/blog/python/python-web-applications-with-flask-part-iii</id>
    <content type="html"><![CDATA[<p>Please note: This is a collaboration piece between Michael Herman, from Real Python, and Sean Vieira, a Python developer from <a href="http://dedeodesigns.com/">De Deo Designs</a>.</p>

<hr>


<a name="Articles.in.this.series:"></a>
<h3>Articles in this series:</h3>

<ol>
<li>Part I: <a href="http://www.realpython.com/blog/python/python-web-applications-with-flask-part-i/#.Uu6GOHddUp8">Application setup</a></li>
<li>Part II: <a href="http://www.realpython.com/blog/python/python-web-applications-with-flask-part-ii/#.Uu5-EHddUp8">Setup user accounts, Templates, Static files</a></li>
<li><strong>Part III: Testing (unit and integration), Debugging, and Error handling &lt;&mdash; CURRENT ARTICLE</strong></li>
</ol>


<p>Welcome back to the Flask-Tracking development series! For those of you who are just joining us, we are implementing a web analytics application that conforms to <a href="http://www.realpython.com/blog/python/python-web-applications-with-flask-part-i/#toc_1">this napkin specification</a>.  For all those of you following along at home, you may check out today&rsquo;s code with-</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>git checkout v0.3
</span></code></pre></td></tr></table></div></figure>


<p>-or you may download it from the <a href="https://github.com/mjhea0/flask-tracking/releases">releases page on Github</a>. Those of you who are just joining us may wish to read <a href="http://www.realpython.com/blog/python/python-web-applications-with-flask-part-i/#toc_5">a note on the repository structure</a> as well.</p>

<p><a href="http://www.realpython.com/blog/python/python-web-applications-with-flask-part-ii-app-creation/">In the previous segment</a> we added user accounts to our application. This week we&rsquo;ll work on implementing a testing framework, talk a bit about why testing is important and then write some tests for our application. After, we&rsquo;ll talk a bit about debugging errors in our application and logging.</p>

<a name="Why.Testing"></a>
<h2>Why Testing</h2>

<p>Before we actually write any of our tests lets talk about why testing is important. If you remember the Zen of Python from <a href="http://www.realpython.com/blog/python/python-web-applications-with-flask-part-i/">Part 1</a>, you may have noticed that &ldquo;Simple is better than complex&rdquo; is right above &ldquo;Complex is better than complicated&rdquo;.  <em>Simple is the ideal, complex is often a reality.</em> Web applications, in particular, have many moving parts, and can very quickly move from simple to complex.</p>

<p>As the complexity of our application grows we want to ensure that the various moving parts we create continue to work together in a harmonious fashion.  We don&rsquo;t want to change the signature of a utility function that breaks a seemingly unrelated feature in production. Moreover, we want to ensure that our changes still preserve <em>correct</em> (not simply valid) functionality. A method that always returns the same <code>datetime</code> instance is valid and correct twice a day, but valid and <em>incorrect</em> all the rest of the time.</p>

<p>Tests are a great debugging aid. Writing a test that produces the invalid behavior we are seeing helps us look at our code from a different perspective. In addition, once we have the test passing we have ensured that we will not re-introduce this bug again (at least in that particular way).</p>

<p>Tests are also an excellent source of documentation.  Since they have to deal with expected inputs and outputs reading a test suite will clarify what the code under test is expected to do.  This will illuminate unclear segments of the documentation that we have written (or in simple cases, even substitute for it).</p>

<p>Finally, tests can be a wonderful exploratory aid &ndash; sketching out how we <em>want</em> to interact with our code before we write it reveals simpler APIs, and helps us paper over the internal complexity of a domain.  <a href="http://en.wikipedia.org/wiki/Test-driven_development">&ldquo;Test Driven Development&rdquo;</a> is the ultimate commitment to this process.  In TDD we first write tests to cover our code&rsquo;s functionality and only then do we write that code.</p>

<p>Tests will make it obvious:</p>

<ul>
<li>When code isn&rsquo;t working,</li>
<li>What code is broken, and</li>
<li>Why we wrote this code in the first place.</li>
</ul>


<p>Every time we go to add a feature to our application, fix a bug or change some code we should make sure our code is adequately covered by tests and that the tests all pass after we&rsquo;re done.</p>

<p>Do:</p>

<ul>
<li>Add tests to cover the basic functionality of your code.</li>
<li>Add tests to cover as many corner/edge cases of your code that you can think of.</li>
<li>Add tests to cover the corner/edge cases you didn&rsquo;t think of after you go back and fix them.</li>
<li>Remind your coding peers to adequately test their code.</li>
<li>Bug people about code that doesn&rsquo;t pass tests.</li>
</ul>


<p>Do Not:</p>

<ul>
<li>Commit code without tests.</li>
<li>Commit code that doesn&rsquo;t pass or breaks tests.</li>
<li>Change your tests so your code passes without fixing the problem.</li>
</ul>


<p>Now that we&rsquo;ve worked out why testing is so important lets start writing some tests for our application.</p>

<a name="Setting.up"></a>
<h2>Setting up</h2>

<p>Each chunk of functionality needs to have tests. To do this in a neat and concise way each package will get a <code>tests.py</code> module in it. This way we know where the tests for each package are and that they&rsquo;re contained in the package if we ever need to break it out of our application.</p>

<p>We&rsquo;ll use <a href="http://pythonhosted.org/Flask-Testing/"><code>Flask-Testing</code></a> extension because it has a bunch of useful testing features that we&rsquo;d be setting up anyways. Go ahead and add <code>Flask-Testing==0.4</code> to the bottom of <code>requirements.txt</code> then run <code>pip install -r requirements.txt</code>.</p>

<p>Flask-Testing eliminates almost all of the boilerplate of setting up Flask for unit testing.  The little bit that remains we will place in a new module <code>test_base.py</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># flask_testing/test_base.py</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask.ext.testing</span> <span class="kn">import</span> <span class="n">TestCase</span>
</span><span class='line'>
</span><span class='line'><span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">app</span><span class="p">,</span> <span class="n">db</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">BaseTestCase</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
</span><span class='line'>    <span class="sd">&quot;&quot;&quot;A base test case for flask-tracking.&quot;&quot;&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">create_app</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <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="s">&#39;config.TestConfiguration&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">app</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">db</span><span class="o">.</span><span class="n">create_all</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">tearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">remove</span><span class="p">()</span>
</span><span class='line'>        <span class="n">db</span><span class="o">.</span><span class="n">drop_all</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>This test case doesn&rsquo;t do anything spectacular &ndash; it just configures the application with our test configuration, creates all of our tables at the start of every test and deletes all of our tables at the end of every test.  This way every test case starts out with a clean slate and we can spend more time writing tests and less time debugging our test cases.  Since every test case will inherit from our new <code>BaseTestCase()</code> class we will avoid copying and pasting this configuration into every package we create for our application.</p>

<p>One additional thing we have done is modularize our configurations.  The original <code>config.py</code> module supported only one configuration &ndash; we can update that to allow for differences between environments.  As a reminder, this is what <code>config.py</code> looked like in <a href="http://www.realpython.com/blog/python/python-web-applications-with-flask-part-ii-app-creation/">Part 2</a>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># config.py</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">abspath</span><span class="p">,</span> <span class="n">dirname</span><span class="p">,</span> <span class="n">join</span>
</span><span class='line'>
</span><span class='line'><span class="n">_cwd</span> <span class="o">=</span> <span class="n">dirname</span><span class="p">(</span><span class="n">abspath</span><span class="p">(</span><span class="n">__file__</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="s">&#39;flask-session-insecure-secret-key&#39;</span>
</span><span class='line'><span class="n">SQLALCHEMY_DATABASE_URI</span> <span class="o">=</span> <span class="s">&#39;sqlite:///&#39;</span> <span class="o">+</span> <span class="n">join</span><span class="p">(</span><span class="n">_cwd</span><span class="p">,</span> <span class="s">&#39;flask-tracking.db&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">SQLALCHEMY_ECHO</span> <span class="o">=</span> <span class="bp">True</span>
</span></code></pre></td></tr></table></div></figure>


<p>It looks almost the same now &ndash; we simply created a class that holds all of these configuration values:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">abspath</span><span class="p">,</span> <span class="n">dirname</span><span class="p">,</span> <span class="n">join</span>
</span><span class='line'>
</span><span class='line'><span class="n">_cwd</span> <span class="o">=</span> <span class="n">dirname</span><span class="p">(</span><span class="n">abspath</span><span class="p">(</span><span class="n">__file__</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">BaseConfiguration</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
</span><span class='line'>    <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>    <span class="n">TESTING</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>    <span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="s">&#39;flask-session-insecure-secret-key&#39;</span>
</span><span class='line'>    <span class="n">HASH_ROUNDS</span> <span class="o">=</span> <span class="mi">100000</span>
</span><span class='line'>    <span class="c"># ... etc. ...</span>
</span></code></pre></td></tr></table></div></figure>


<p>which we can then inherit from:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">TestConfiguration</span><span class="p">(</span><span class="n">BaseConfiguration</span><span class="p">):</span>
</span><span class='line'>    <span class="n">TESTING</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>    <span class="n">WTF_CSRF_ENABLED</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">SQLALCHEMY_DATABASE_URI</span> <span class="o">=</span> <span class="s">&#39;sqlite:///:memory:&#39;</span>  <span class="c"># + join(_cwd, &#39;testing.db&#39;)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># Since we want our unit tests to run quickly</span>
</span><span class='line'>    <span class="c"># we turn this down - the hashing is still done</span>
</span><span class='line'>    <span class="c"># but the time-consuming part is left out.</span>
</span><span class='line'>    <span class="n">HASH_ROUNDS</span> <span class="o">=</span> <span class="mi">1</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way settings that are common to all environments can be easily shared, and we can easily override what we need to in our environment specific configurations.  (This pattern comes directly from <a href="http://flask.pocoo.org/docs/config/#development-production">Flask&rsquo;s excellent documentation</a>.)</p>

<p>We are using an in-memory SQLite database for our tests to ensure that our tests execute as quickly as possible.  We want to enjoy running our tests, and we can only do that if they execute in a reasonable amount of time.  If we really need access to the result of the test run we can override the <code>:memory:</code> setting with the calculated path to <code>tests.db</code>. (That&rsquo;s the commented out <code>+ join(_cwd, 'testing.db')</code> in our <code>TestConfiguration</code>).</p>

<p>We have also added a <code>HASH_ROUNDS</code> key to our configuration to control how many times a user&rsquo;s password should be hashed before it is stored.  We can change <code>flask_tracking.users.models.User</code>&rsquo;s <code>_hash_password</code> method to use this key:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">current_app</span>
</span><span class='line'>
</span><span class='line'><span class="c"># ... snip ...</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">_hash_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># ... snip ...</span>
</span><span class='line'>    <span class="n">rounds</span> <span class="o">=</span> <span class="n">current_app</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;HASH_ROUNDS&quot;</span><span class="p">,</span> <span class="mi">100000</span><span class="p">)</span>
</span><span class='line'>    <span class="n">buff</span> <span class="o">=</span> <span class="n">pbkdf2_hmac</span><span class="p">(</span><span class="s">&quot;sha512&quot;</span><span class="p">,</span> <span class="n">pwd</span><span class="p">,</span> <span class="n">salt</span><span class="p">,</span> <span class="n">iterations</span><span class="o">=</span><span class="n">rounds</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This ensures that our unit tests will run quickly &ndash; otherwise, every time we need to create or log in a user we will have to wait for 100,000 rounds of sha512 to complete before we can continue our test.</p>

<p>Finally, we will need to update our <code>app.from_object</code> call in <code>flask_tracking/__init__.py</code>.  Before, we were loading the config using <code>app.from_object('config')</code>.  Now that we have two configurations in our config module we will want to change that to <code>app.from_object('config.BaseConfiguration')</code>.</p>

<p>Now we are ready to test our application.</p>

<a name="The.Tests"></a>
<h2>The Tests</h2>

<p>We&rsquo;ll start with the <code>users</code> package.</p>

<p>From <a href="http://www.realpython.com/blog/python/python-web-applications-with-flask-part-ii-app-creation/">last time</a> we know that the <code>users</code> package is responsible for:</p>

<ul>
<li>Registration,</li>
<li>Logging in, and</li>
<li>Logging out.</li>
</ul>


<p>So we need to write tests that cover users signing up, users logging in and then users logging out.  Let&rsquo;s start with a simple case &ndash; an existing user attempting to log in:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># flask_tracking/users/tests.py</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">url_for</span>
</span><span class='line'>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask_tracking.test_base</span> <span class="kn">import</span> <span class="n">BaseTestCase</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">User</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">UserViewsTests</span><span class="p">(</span><span class="n">BaseTestCase</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_users_can_login</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">User</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;Joe&#39;</span><span class="p">,</span> <span class="n">email</span><span class="o">=</span><span class="s">&#39;joe@joes.com&#39;</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="s">&#39;12345&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">url_for</span><span class="p">(</span><span class="s">&#39;users.login&#39;</span><span class="p">),</span>
</span><span class='line'>                                    <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;email&#39;</span><span class="p">:</span> <span class="s">&#39;joe@joes.com&#39;</span><span class="p">,</span> <span class="s">&#39;password&#39;</span><span class="p">:</span> <span class="s">&#39;12345&#39;</span><span class="p">})</span>
</span><span class='line'>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assert_redirects</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="n">url_for</span><span class="p">(</span><span class="s">&#39;tracking.index&#39;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Since every test case starts out with a completely clean database we have to create an existing user first.  We can then submit the same request that our user (Joe) would submit if he were trying to log in.  We want to ensure that if Joe logs in successfully, he will be redirected back to the home page.</p>

<p>We can run our tests with the <a href="http://docs.python.org/2/library/unittest.html"><code>unittest</code></a> test runner, which comes built-in with Python.  Run the following command from the root of the project:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python -m unittest discover
</span></code></pre></td></tr></table></div></figure>


<p>That results in the following output:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>----------------------------------------------------------------------
</span><span class='line'>Ran 1 <span class="nb">test </span>in 0.045s
</span><span class='line'>
</span><span class='line'>OK
</span></code></pre></td></tr></table></div></figure>


<p>Hurray! We now have a passing test! Let&rsquo;s also test that our integration with Flask-Login is working. <code>current_user</code> should be Joe, so we should be able to do the following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">flask.ext.login</span> <span class="kn">import</span> <span class="n">current_user</span>
</span><span class='line'>
</span><span class='line'><span class="c"># And then inside of our test_users_can_login function:</span>
</span><span class='line'><span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="n">current_user</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s">&#39;Joe&#39;</span><span class="p">)</span>
</span><span class='line'><span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">current_user</span><span class="o">.</span><span class="n">is_anonymous</span><span class="p">())</span>
</span></code></pre></td></tr></table></div></figure>


<p>However, if we were to try this we would get the following error:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>AttributeError: <span class="s1">&#39;AnonymousUserMixin&#39;</span> object has no attribute <span class="s1">&#39;name&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>current_user</code> needs to be accessed within the context of a request (it is a thread-local object, just like <code>flask.request</code>).  When <code>self.client.post</code> completes the request and every thread-local object is torn down.  We need to preserve the request context so we can test our integration with Flask-Login.  Fortunately, <code>Flask</code>&rsquo;s <a href="http://flask.pocoo.org/docs/api/#flask.Flask.test_client"><code>test_client</code></a> is a <a href="http://flask.pocoo.org/docs/testing/#keeping-the-context-around">context manager</a>, which means that we can use it in a <code>with</code> statement and it will keep the context around as long as we need it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="p">:</span>
</span><span class='line'>    <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">url_for</span><span class="p">(</span><span class="s">&#39;users.login&#39;</span><span class="p">),</span>
</span><span class='line'>                                <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;email&#39;</span><span class="p">:</span> <span class="s">&#39;joe@joes.com&#39;</span><span class="p">,</span> <span class="s">&#39;password&#39;</span><span class="p">:</span> <span class="s">&#39;12345&#39;</span><span class="p">})</span>
</span><span class='line'>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assert_redirects</span><span class="p">(</span><span class="n">response</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>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="n">current_user</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s">&#39;Joe&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">current_user</span><span class="o">.</span><span class="n">is_anonymous</span><span class="p">())</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, when we run our test again, we pass!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>----------------------------------------------------------------------
</span><span class='line'>Ran 1 <span class="nb">test </span>in 0.053s
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s ensure that when Joe is logged in, he can log out:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">test_users_can_logout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="n">User</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;Joe&quot;</span><span class="p">,</span> <span class="n">email</span><span class="o">=</span><span class="s">&quot;joe@joes.com&quot;</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="s">&quot;12345&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="p">:</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">url_for</span><span class="p">(</span><span class="s">&quot;users.login&quot;</span><span class="p">),</span>
</span><span class='line'>                         <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s">&quot;email&quot;</span><span class="p">:</span> <span class="s">&quot;joe@joes.com&quot;</span><span class="p">,</span>
</span><span class='line'>                               <span class="s">&quot;password&quot;</span><span class="p">:</span> <span class="s">&quot;12345&quot;</span><span class="p">})</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url_for</span><span class="p">(</span><span class="s">&quot;users.logout&quot;</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="n">current_user</span><span class="o">.</span><span class="n">is_anonymous</span><span class="p">())</span>
</span></code></pre></td></tr></table></div></figure>


<p>Once again, we create Joe (remember, the database is reset at the end of every test).  Then we log him in (which we know works because our first test is passing).  Finally, we log him out by requesting the logout page via <code>self.client.get(url_for("users.logout"))</code> and ensure that the user we have is once again anonymous.  Run the tests again and bask in the satisfaction of having two passing tests.</p>

<p>A couple of other things that we will want to check:</p>

<ul>
<li>Can a user register and then log into the application?</li>
<li>When a user logs out, do they get redirected back to the index page?</li>
</ul>


<p>These tests are available in <a href="https://github.com/mjhea0/flask-tracking">the <code>flask-tracking</code> repository</a>, should you want to review them.  Since they are similar to what we have already written, we will skip them here.</p>

<a name="Mocks.and.Integration.Tests"></a>
<h2>Mocks and Integration Tests</h2>

<p>There is one part of our application though, which is a little different from the rest &ndash; our <code>add_visit</code> endpoint in the <code>tracking</code> package not only interacts with the database and the user &ndash; it also interacts with the third-party service <a href="http://freegeoip.net/">Free GeoIP</a>.  As this is a potential source of breakage, we will want to test it thoroughly.  Since Free GeoIP is a third party service (which we might not always have access to) it also gives us a good opportunity to talk about the difference between unit and integration tests.</p>

<a name="Unit.vs..Integration.Tests"></a>
<h3>Unit vs. Integration Tests</h3>

<p>Everything that we have written so far has fallen under the heading of a unit test. A <strong>unit test</strong> is a test of the smallest possible piece of functionality of <em>our</em> code &ndash; a test of an indivisible section of code (generally a function or method).</p>

<p><strong>Integration tests</strong>, on the other hand, test our application at its boundaries &ndash; does our application interact correctly with this other application (which may well be something we have written)?  Testing that our application properly calls and interacts with Free GeoIP is an integration test.  These sorts of tests are very important, as they let us know that the features that we are depending on still work the way we expect them to. (Yes, that doesn&rsquo;t help us if Free GeoIP changes its contract (API), or goes down completely, while we are running our application in production but that is what logging is for &ndash; which we will cover a little later on.)</p>

<p>However, the issue with integration tests is that they are often more than an order of magnitude slower than unit tests.  A large number of integration tests can slow down our test suite to the point where it takes more than a minute to run &ndash; once it crosses that boundary, our test suite starts to be a hindrance rather than an assistant.  Taking the time to run our tests now breaks our flow of concentration, rather than simply verifying that we are on the right track.  Also, in the case of distributed services like Free GeoIP, it means we cannot actually run our test suite if we are offline or if Free GeoIP is down.</p>

<p>This leaves us in a fine quandary &ndash; on the one hand, integration tests are very important, and on the other hand, running integration tests is likely to break our work flow.</p>

<p>The solution is simple &ndash; we can create a bare-bones local implementation of the service we are calling (which is called a mock in testing parlance) and run our unit tests using this mock.  We can separate out our integration tests into a separate file and run those before we commit changes to our code.  That way, we get the speed of good unit tests and retain the certainty that integration tests provide.</p>

<a name="Mocking.Free.GeoIP"></a>
<h3>Mocking Free GeoIP</h3>

<p>If you remember from <a href="http://www.realpython.com/blog/python/python-web-applications-with-flask-part-ii-app-creation/">Part 2</a> we added a <code>geodata</code> module to our <code>tracking</code> package which implemented a single function <code>get_geodata</code>.  We use this function in our <code>tracking.add_visit</code> view:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">ip_address</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">access_route</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">or</span> <span class="n">request</span><span class="o">.</span><span class="n">remote_addr</span>
</span><span class='line'><span class="n">geodata</span> <span class="o">=</span> <span class="n">get_geodata</span><span class="p">(</span><span class="n">ip_address</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we want to do in our <em>unit</em> test is ensure that when <code>get_geodata</code> works as expected we will properly record the visit in the database.  However, we don&rsquo;t want to call Free GeoIP (otherwise, our test will be slow in comparison to our other tests and we will not be able to run the tests when offline.)  We need to replace <code>get_geodata</code> with another function (a mock).</p>

<p>First, let&rsquo;s install <a href="http://mock.readthedocs.org/en/latest/">a mocking library</a> to make this easier.  Add <a href="http://mock.readthedocs.org/en/latest/"><code>mock==1.0.1</code></a> to requirements.txt and <code>pip install -r requirements.txt</code> again. (If you are using Python 3.3 or greater, you already have mock installed as <code>unittest.mock</code>.)</p>

<p>Now we can write our unit test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># flask_tracking/tracking/tests.py</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">decimal</span> <span class="kn">import</span> <span class="n">Decimal</span>
</span><span class='line'>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">url_for</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">mock</span> <span class="kn">import</span> <span class="n">Mock</span><span class="p">,</span> <span class="n">patch</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">werkzeug.datastructures</span> <span class="kn">import</span> <span class="n">Headers</span>
</span><span class='line'>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask_tracking.test_base</span> <span class="kn">import</span> <span class="n">BaseTestCase</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask_tracking.users.models</span> <span class="kn">import</span> <span class="n">User</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Site</span><span class="p">,</span> <span class="n">Visit</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">..tracking</span> <span class="kn">import</span> <span class="n">views</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">TrackingViewsTests</span><span class="p">(</span><span class="n">BaseTestCase</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_visitors_location_is_derived_from_ip</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">user</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;Joe&#39;</span><span class="p">,</span> <span class="n">email</span><span class="o">=</span><span class="s">&#39;joe@joe.com&#39;</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="s">&#39;12345&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="n">site</span> <span class="o">=</span> <span class="n">Site</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">user_id</span><span class="o">=</span><span class="n">user</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">mock_geodata</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;get_geodata&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="n">mock_geodata</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>            <span class="s">&#39;city&#39;</span><span class="p">:</span> <span class="s">&#39;Los Angeles&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="s">&#39;zipcode&#39;</span><span class="p">:</span> <span class="s">&#39;90001&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="s">&#39;latitude&#39;</span><span class="p">:</span> <span class="s">&#39;34.05&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="s">&#39;longitude&#39;</span><span class="p">:</span> <span class="s">&#39;-118.25&#39;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">url</span> <span class="o">=</span> <span class="n">url_for</span><span class="p">(</span><span class="s">&#39;tracking.add_visit&#39;</span><span class="p">,</span> <span class="n">site_id</span><span class="o">=</span><span class="n">site</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
</span><span class='line'>        <span class="n">wsgi_environment</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;REMOTE_ADDR&#39;</span><span class="p">:</span> <span class="s">&#39;1.2.3.4&#39;</span><span class="p">}</span>
</span><span class='line'>        <span class="n">headers</span> <span class="o">=</span> <span class="n">Headers</span><span class="p">([(</span><span class="s">&#39;Referer&#39;</span><span class="p">,</span> <span class="s">&#39;/some/url&#39;</span><span class="p">)])</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">with</span> <span class="n">patch</span><span class="o">.</span><span class="n">object</span><span class="p">(</span><span class="n">views</span><span class="p">,</span> <span class="s">&#39;get_geodata&#39;</span><span class="p">,</span> <span class="n">mock_geodata</span><span class="p">):</span>
</span><span class='line'>            <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="p">:</span>
</span><span class='line'>                <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">environ_overrides</span><span class="o">=</span><span class="n">wsgi_environment</span><span class="p">,</span>
</span><span class='line'>                                <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>                <span class="n">visits</span> <span class="o">=</span> <span class="n">Visit</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>                <span class="n">mock_geodata</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span><span class="s">&#39;1.2.3.4&#39;</span><span class="p">)</span>
</span><span class='line'>                <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">visits</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>                <span class="n">first_visit</span> <span class="o">=</span> <span class="n">visits</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span class='line'>                <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="s">&quot;/some/url&quot;</span><span class="p">,</span> <span class="n">first_visit</span><span class="o">.</span><span class="n">url</span><span class="p">)</span>
</span><span class='line'>                <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="s">&#39;Los Angeles, 90001&#39;</span><span class="p">,</span> <span class="n">first_visit</span><span class="o">.</span><span class="n">location</span><span class="p">)</span>
</span><span class='line'>                <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="mf">34.05</span><span class="p">,</span> <span class="n">first_visit</span><span class="o">.</span><span class="n">latitude</span><span class="p">)</span>
</span><span class='line'>                <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="o">-</span><span class="mf">118.25</span><span class="p">,</span> <span class="n">first_visit</span><span class="o">.</span><span class="n">longitude</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Don&rsquo;t worry &ndash; the pain of testing these sorts of integrations is mitigated by the fact that you generally have fewer of them in your application than you have units of code.  Let&rsquo;s walk through this code section by section and break it down into digestible chunks.</p>

<a name="Set.up.the.test.data.and.mocks"></a>
<h3>Set up the test data and mocks</h3>

<p>First, we set up a user and a site since the database is empty at the start of every test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">test_visitors_location_is_derived_from_ip</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="n">user</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;Joe&#39;</span><span class="p">,</span> <span class="n">email</span><span class="o">=</span><span class="s">&#39;joe@joe.com&#39;</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="s">&#39;12345&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="n">site</span> <span class="o">=</span> <span class="n">Site</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">user_id</span><span class="o">=</span><span class="n">user</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then, we create a mock function, and specify that it should return a dictionary containing the coordinates for Los Angeles every time it is called (we could have simply created a simple function that always returned the dictionary, but mock also provides the <a href="http://mock.readthedocs.org/en/latest/patch.html"><code>patch.*</code></a> context managers, which are extremely useful, so we&rsquo;ll go the whole nine yards with the library):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">mock_geodata</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;get_geodata&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">mock_geodata</span><span class="o">.</span><span class="n">return_value</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="s">&#39;city&#39;</span><span class="p">:</span> <span class="s">&#39;Los Angeles&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;zipcode&#39;</span><span class="p">:</span> <span class="s">&#39;90001&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;latitude&#39;</span><span class="p">:</span> <span class="s">&#39;34.05&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s">&#39;longitude&#39;</span><span class="p">:</span> <span class="s">&#39;-118.25&#39;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, we set up the URL that we are going to visit and the parts of the WSGI environment that we need for <code>tracking.add_visit</code> to work (which, in this case is just the IP address of our fake end user&rsquo;s visitor and the URL they supposedly came from):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">url</span> <span class="o">=</span> <span class="n">url_for</span><span class="p">(</span><span class="s">&#39;tracking.add_visit&#39;</span><span class="p">,</span> <span class="n">site_id</span><span class="o">=</span><span class="n">site</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
</span><span class='line'><span class="n">wsgi_environment</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;REMOTE_ADDR&#39;</span><span class="p">:</span> <span class="s">&#39;1.2.3.4&#39;</span><span class="p">}</span>
</span><span class='line'><span class="n">headers</span> <span class="o">=</span> <span class="n">Headers</span><span class="p">([(</span><span class="s">&#39;Referer&#39;</span><span class="p">,</span> <span class="s">&#39;/some/url&#39;</span><span class="p">)])</span>
</span></code></pre></td></tr></table></div></figure>


<a name="Patch.the.mock.into.our.tracking.module"></a>
<h3>Patch the mock into our tracking module</h3>

<p>We explicitly imported the <code>flask_tracking.tracking.views</code> module into our <code>tests</code> module with:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">..tracking</span> <span class="kn">import</span> <span class="n">views</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we patch that module&rsquo;s <code>get_views</code> name to point to our <code>mock_geodata</code> object rather than the <code>flask_tracking.tracking.geodata.get_geodata</code> function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">with</span> <span class="n">patch</span><span class="o">.</span><span class="n">object</span><span class="p">(</span><span class="n">views</span><span class="p">,</span> <span class="s">&#39;get_geodata&#39;</span><span class="p">,</span> <span class="n">mock_geodata</span><span class="p">):</span>
</span></code></pre></td></tr></table></div></figure>


<p>By using <code>patch.object</code> as a context manager, we ensure that after we exit this <code>with</code> block <code>flask_tracking.tracking.views.get_geodata</code> will once again point to <code>flask_tracking.tracking.geodata.get_geodata</code>.  We could also have used <code>patch.object</code> as a decorator:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">mock_geodata</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;get_geodata&#39;</span><span class="p">)</span>
</span><span class='line'><span class="c"># ... snip return setup ...</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">TrackingViewsTests</span><span class="p">(</span><span class="n">BaseTestCase</span><span class="p">):</span>
</span><span class='line'>    <span class="nd">@patch.object</span><span class="p">(</span><span class="n">views</span><span class="p">,</span> <span class="s">&#39;get_geodata&#39;</span><span class="p">,</span> <span class="n">mock_geodata</span><span class="p">)</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_visitors_location_is_derived_from_ip</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span></code></pre></td></tr></table></div></figure>


<p>or even a class decorator:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@patch.object</span><span class="p">(</span><span class="n">views</span><span class="p">,</span> <span class="s">&#39;get_geodata&#39;</span><span class="p">,</span> <span class="n">mock_geodata</span><span class="p">)</span>
</span><span class='line'><span class="k">class</span> <span class="nc">TrackingViewsTests</span><span class="p">(</span><span class="n">BaseTestCase</span><span class="p">):</span>
</span></code></pre></td></tr></table></div></figure>


<p>The only difference is the scope of the patch.  The function decorator version ensures that as long as we are inside the <code>test_visitors_location_is_derived_from_ip</code> function <code>get_geodata</code> points at our mock, while the class decorator version ensures that every function that starts with <code>test</code> inside of <code>TrackingViewsTests</code> will see the mocked version of <code>get_geodata</code>.</p>

<p><em>Personally, I prefer to keep the scope of my mocks as limited as possible. It helps ensure that I keep my testing scope in mind, and saves me from surprises where I was expecting to have access to the real object and have to de-patch it.</em></p>

<a name="Run.the.test"></a>
<h3>Run the test</h3>

<p>Having set up everything we need we can now make our request:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="p">:</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">environ_overrides</span><span class="o">=</span><span class="n">wsgi_environment</span><span class="p">,</span>
</span><span class='line'>                    <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>We provide our controller with the viewer&rsquo;s IP address through the <code>wsgi_environment</code> dictionary we created (<code>wsgi_environment = {'REMOTE_ADDR': '1.2.3.4'}</code>).  Flask&rsquo;s test client is an instance of Werkzeug&rsquo;s test client &ndash; which supports all of the arguments that you can pass to <a href="http://werkzeug.pocoo.org/docs/test/#werkzeug.test.EnvironBuilder"><code>EnvironmentBuilder</code></a>.</p>

<a name="Assert.that.everything.worked"></a>
<h3>Assert that everything worked</h3>

<p>Finally, we fetch all of the visits from the <code>tracking_visit</code> table:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">visits</span> <span class="o">=</span> <span class="n">Visit</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>and verify that:</p>

<ul>
<li>We used the user&rsquo;s IP address to lookup his geodata:</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">mock_geodata</span><span class="o">.</span><span class="n">assert_called_once_with</span><span class="p">(</span><span class="s">&#39;1.2.3.4&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>The request only generated one visit:</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">visits</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>The location data was properly persisted:</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">first_visit</span> <span class="o">=</span> <span class="n">visits</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span class='line'><span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="s">&quot;/some/url&quot;</span><span class="p">,</span> <span class="n">first_visit</span><span class="o">.</span><span class="n">url</span><span class="p">)</span>
</span><span class='line'><span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="s">&#39;Los Angeles, 90001&#39;</span><span class="p">,</span> <span class="n">first_visit</span><span class="o">.</span><span class="n">location</span><span class="p">)</span>
</span><span class='line'><span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&quot;34.05&quot;</span><span class="p">),</span> <span class="n">first_visit</span><span class="o">.</span><span class="n">latitude</span><span class="p">)</span>
</span><span class='line'><span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">Decimal</span><span class="p">(</span><span class="s">&quot;-118.25&quot;</span><span class="p">),</span> <span class="n">first_visit</span><span class="o">.</span><span class="n">longitude</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>When we run <code>python -m unittest discover</code> we get the following output:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>F.....
</span><span class='line'><span class="o">======================================================================</span>
</span><span class='line'>FAIL: test_visitors_location_is_derived_from_ip <span class="o">(</span>flask_tracking.tracking.tests.TrackingViewsTests<span class="o">)</span>
</span><span class='line'>----------------------------------------------------------------------
</span><span class='line'>Traceback <span class="o">(</span>most recent call last<span class="o">)</span>:
</span><span class='line'>  File <span class="s2">&quot;~/dev/flask-tracking/flask_tracking/tracking/tests.py&quot;</span>, line 41, in test_visitors_location_is_derived_from_ip
</span><span class='line'>    self.assertEqual<span class="o">(</span><span class="s1">&#39;Los Angeles, 90001&#39;</span>, first_visit.location<span class="o">)</span>
</span><span class='line'>AssertionError: <span class="s1">&#39;Los Angeles, 90001&#39;</span> !<span class="o">=</span> None
</span><span class='line'>
</span><span class='line'>----------------------------------------------------------------------
</span><span class='line'>Ran 6 tests in 0.147s
</span><span class='line'>
</span><span class='line'>FAILED <span class="o">(</span><span class="nv">failures</span><span class="o">=</span>1<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ah, a failure! Apparently, we are not mapping location properly, as the <code>Visit</code>&rsquo;s location is not being persisted in the database.  Checking our view code reveals that we are indeed setting <code>location</code> when we construct our <code>VisitForm</code> &hellip; but that we do not actually <em>have</em> a <code>location</code> field set up for our <code>VisitForm</code>!  Good thing we caught that before we went live! (This duplication of fields causes problems, and should suggest something to you all &ndash; when it does I suggest you take a look at <a href="http://wtforms-alchemy.readthedocs.org/en/latest/"><code>wtforms-alchemy</code></a>.)</p>

<p>Once we add <code>location</code>, <code>latitude</code>, and <code>longitude</code> fields to our <code>VisitForm</code> we should be able to run our tests and get:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>.....
</span><span class='line'>----------------------------------------------------------------------
</span><span class='line'>Ran 5 tests in 0.150s
</span><span class='line'>
</span><span class='line'>OK
</span></code></pre></td></tr></table></div></figure>


<p>And that completes our first test with mocks.</p>

<a name="Debugging"></a>
<h2>Debugging</h2>

<p>Our unit tests are very useful &ndash; but what happens when we try to test something and the test code does not do what we expect it to do? Or even worse, when a user calls us up and complains that he has encountered an error?  If it is a system-wide problem, running our unit tests might reveal the issue &hellip; but that could only happen if we checked in <em>and deployed</em> code without running our tests (and we would never do that, now would we?)</p>

<p>Assume that we always run our tests before committing and deploying, then our unit tests cannot help us when something breaks in production.  Instead, we will need to ask the user to provided us with a complete example, so that we can debug it locally.</p>

<p>Let&rsquo;s say that we engaged in a little bit of refactoring of our login form-</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># If you can see what&#39;s broken already, give yourself a prize</span>
</span><span class='line'><span class="c"># and write a test to ensure it never happens again :-)</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">LoginForm</span><span class="p">(</span><span class="n">Form</span><span class="p">):</span>
</span><span class='line'>    <span class="n">email</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">StringField</span><span class="p">(</span><span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">InputRequired</span><span class="p">(),</span> <span class="n">Email</span><span class="p">()])</span>
</span><span class='line'>    <span class="n">password</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">StringField</span><span class="p">(</span><span class="n">validators</span><span class="o">=</span><span class="p">[</span><span class="n">InputRequired</span><span class="p">()])</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">validate_login</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
</span><span class='line'>        <span class="k">try</span><span class="p">:</span>
</span><span class='line'>            <span class="n">user</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">User</span><span class="o">.</span><span class="n">email</span> <span class="o">==</span> <span class="n">form</span><span class="o">.</span><span class="n">email</span><span class="o">.</span><span class="n">data</span><span class="p">)</span><span class="o">.</span><span class="n">one</span><span class="p">()</span>
</span><span class='line'>        <span class="k">except</span> <span class="p">(</span><span class="n">MultipleResultsFound</span><span class="p">,</span> <span class="n">NoResultFound</span><span class="p">):</span>
</span><span class='line'>            <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="s">&quot;Invalid user&quot;</span><span class="p">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">user</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
</span><span class='line'>            <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="s">&quot;Invalid user&quot;</span><span class="p">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="ow">not</span> <span class="n">user</span><span class="o">.</span><span class="n">is_valid_password</span><span class="p">(</span><span class="n">form</span><span class="o">.</span><span class="n">password</span><span class="o">.</span><span class="n">data</span><span class="p">):</span>
</span><span class='line'>            <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="s">&quot;Invalid password&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>        <span class="c"># Make the current user available</span>
</span><span class='line'>        <span class="c"># to calling code.</span>
</span><span class='line'>        <span class="n">form</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">user</span>
</span></code></pre></td></tr></table></div></figure>


<p>-and when we push it to production our first user sends us an email to let us know that he mis-typed his password and was still logged into the system.  We verify that this is the case on our live site. Woah, Nelly, that is not at all acceptable!  So we quickly take down the login page and replace it with a message saying we are down for maintenance and we&rsquo;ll be back as soon as possible (<em>Rule #0 of SaaS &ndash; always treat your customers the way you would want to be treated</em>).</p>

<p>Looking at it locally, we don&rsquo;t see any reason that users <em>should</em> be able to log in without a password.  However, we haven&rsquo;t written any tests to test that a mis-typed password is rejected with an error message, so we can&rsquo;t be 100% sure that this isn&rsquo;t an error in our code.  So let&rsquo;s write a test case and see what happens:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">test_invalid_password_is_rejected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="n">User</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;Joe&quot;</span><span class="p">,</span> <span class="n">email</span><span class="o">=</span><span class="s">&quot;joe@joes.com&quot;</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="s">&quot;12345&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="p">:</span>
</span><span class='line'>        <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">url_for</span><span class="p">(</span><span class="s">&quot;users.login&quot;</span><span class="p">),</span>
</span><span class='line'>                                    <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s">&quot;email&quot;</span><span class="p">:</span> <span class="s">&quot;joe@joes.com&quot;</span><span class="p">,</span>
</span><span class='line'>                                          <span class="s">&quot;password&quot;</span><span class="p">:</span> <span class="s">&quot;*****&quot;</span><span class="p">})</span>
</span><span class='line'>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="n">current_user</span><span class="o">.</span><span class="n">is_anonymous</span><span class="p">())</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assert_200</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertIn</span><span class="p">(</span><span class="s">&quot;Invalid password&quot;</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Running the tests results in a failure:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>.F....
</span><span class='line'><span class="o">======================================================================</span>
</span><span class='line'>FAIL: test_invalid_password_is_rejected <span class="o">(</span>app.users.tests.UserViewsTests<span class="o">)</span>
</span><span class='line'>----------------------------------------------------------------------
</span><span class='line'>Traceback <span class="o">(</span>most recent call last<span class="o">)</span>:
</span><span class='line'>  File <span class="s2">&quot;~/dev/flask-tracking/flask_tracking/users/tests.py&quot;</span>, line 34, in test_invalid_password_is_rejected
</span><span class='line'>    self.assertTrue<span class="o">(</span>current_user.is_anonymous<span class="o">())</span>
</span><span class='line'>AssertionError: False is not <span class="nb">true</span>
</span></code></pre></td></tr></table></div></figure>


<p>Okay, so we can reproduce it locally.  And we have a test case to yell at us until we fix the problem.  Good. We&rsquo;re on our way!</p>

<p>There are several ways we could debug the problem:</p>

<ul>
<li>We could scatter <code>print</code> statements throughout the application until we find the source of the error.</li>
<li>We could generate intentional errors in our code and look at the existing environment using Flask&rsquo;s built-in debugger.</li>
<li>We could step through the code using a debugger.</li>
</ul>


<p>We&rsquo;ll use all three techniques.  First, let&rsquo;s add a simple <code>print</code> statement to our <code>app.users.models.LoginForm#validate_login</code> method:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">validate_login</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
</span><span class='line'>    <span class="k">print</span> <span class="s">&#39;Validating login&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>When we run our tests again we do not see the &ldquo;Validating login&rdquo; message at all.  That tells us that our method is not being called.  Let&rsquo;s add an intentional error to our view and make use of Flask&rsquo;s internal debugger to verify the state of the world.  First, we&rsquo;ll create a new configuration for debugging:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># config.py</span>
</span><span class='line'><span class="k">class</span> <span class="nc">DebugConfiguration</span><span class="p">(</span><span class="n">BaseConfiguration</span><span class="p">):</span>
</span><span class='line'>    <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then we will update <code>flask_tracking.__init__</code> to use the new debug configuration:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><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="s">&#39;config.DebugConfiguration&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And finally, we will add a Arithmetic error to our <code>login_view</code> method:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">login_view</span><span class="p">():</span>
</span><span class='line'>    <span class="n">form</span> <span class="o">=</span> <span class="n">LoginForm</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">)</span>
</span><span class='line'>    <span class="mi">1</span> <span class="o">/</span> <span class="mi">0</span>  <span class="c"># KABOOM!</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, if we run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>python run.py
</span></code></pre></td></tr></table></div></figure>


<p>And navigate to the login page we will see a nice traceback.  Clicking on the shell icon on the right of the last line of the traceback (<code>1 / 0</code>) will get us an interactive REPL that we can use to test our function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>&gt;&gt;&gt; form.validate_login<span class="o">(</span><span class="nv">field</span><span class="o">=</span>None<span class="o">)</span>  <span class="c"># We don&#39;t use the field argument</span>
</span></code></pre></td></tr></table></div></figure>


<p>This results in:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>Traceback <span class="o">(</span>most recent call last<span class="o">)</span>:
</span><span class='line'>    File <span class="s2">&quot;&lt;debugger&gt;&quot;</span>, line 1, in &lt;module&gt;
</span><span class='line'>    form.validate_login<span class="o">(</span>None<span class="o">)</span>
</span><span class='line'>    File <span class="s2">&quot;~/dev/flask-tracking/flask_tracking/users/forms.py&quot;</span>, line 15, in validate_login
</span><span class='line'>    raise validators.ValidationError<span class="o">(</span><span class="s1">&#39;Invalid user&#39;</span><span class="o">)</span>
</span><span class='line'>    ValidationError: Invalid user
</span></code></pre></td></tr></table></div></figure>


<p>So now we know that our validation function <em>works</em> &ndash; it simply is not being called.  Let&rsquo;s remove that division by zero error from our login view and replace it with a call to <a href="http://docs.python.org/2/library/pdb.html">the Python debugger <code>pdb</code></a>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">login_view</span><span class="p">():</span>
</span><span class='line'>    <span class="n">form</span> <span class="o">=</span> <span class="n">LoginForm</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">)</span>
</span><span class='line'>    <span class="kn">import</span> <span class="nn">pdb</span><span class="p">;</span> <span class="n">pdb</span><span class="o">.</span><span class="n">set_trace</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, when we run our tests again we get a debugger:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>python -m unittest discover .
</span><span class='line'>.&gt; ~/dev/flask-tracking/app/users/views.py<span class="o">(</span>18<span class="o">)</span>login_view<span class="o">()</span>
</span><span class='line'>-&gt; <span class="k">if </span>form.validate_on_submit<span class="o">()</span>:
</span><span class='line'><span class="o">(</span>Pdb<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can step into the <code>validate_on_submit</code> method by typing &ldquo;s&rdquo; for &ldquo;step&rdquo;, and step over calls we are not interested in with &ldquo;n&rdquo; for &ldquo;next&rdquo; (a full introduction to PDB is beyond the scope of this tutorial &ndash; for more information on PDB see it&rsquo;s <a href="http://docs.python.org/2/library/pdb.html">documentation</a> or type &ldquo;h&rdquo; while inside of <code>pdb</code>):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="o">(</span>Pdb<span class="o">)</span> s
</span><span class='line'>--Call--
</span><span class='line'>&gt; ~/.virtualenvs/realpython/lib/python2.7/site-packages/flask_wtf/form.py<span class="o">(</span>120<span class="o">)</span>validate_on_submit<span class="o">()</span>
</span><span class='line'>-&gt; def validate_on_submit<span class="o">(</span>self<span class="o">)</span>:
</span></code></pre></td></tr></table></div></figure>


<p>I won&rsquo;t walk you through the whole debugging session, but needless to say, the issue was with our code. WTForms allows for inline validators in the form <code>validate_[fieldname]</code>.  Our <code>validate_login</code> method is never called because we don&rsquo;t have a field named <code>login</code> in our form.  Let&rsquo;s remove the <code>set_trace</code> call from our controller and rename our <code>flask_tracking.users.forms.LoginForm.validate_login</code> method back to <code>LoginForm.validate_password</code> so that WTForms will pick it up as an inline validator for our <code>password</code> field. This ensures that it only gets called after both the name and password fields have been validated to contain user-supplied data.</p>

<p>Now, when we run our unit tests again, they <em>should</em> pass.  Testing locally reveals that we did indeed fix the issue.  We can now safely deploy and take down our maintenance message.</p>

<a name="Error.Handling"></a>
<h2>Error Handling</h2>

<p>As we have discovered, a test suite does not guarantee that we will have no bugs in our application.  It is possible for users to still come across errors in production.  For example, if we simply blindly accessed <code>request.args['some_optional_key']</code> in one of our controllers and we only wrote tests with that optional key set in the request, the end user would get a <code>400 Bad Request</code> response from Flask by default. We want to show a <em>helpful</em> error message to the user in such cases. We also want to avoid showing the users unbranded or out-of-date pages without much help on where to go, or what to do next.</p>

<p>We can register error handlers with Flask to explicitly handle these sorts of issues.  Let&rsquo;s register one for the most common error &ndash; a mis-typed or no-longer existing link:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@app.errorhandler</span><span class="p">(</span><span class="mi">404</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">page_not_found</span><span class="p">(</span><span class="n">e</span><span class="p">):</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;404.html&#39;</span><span class="p">),</span> <span class="mi">404</span>
</span></code></pre></td></tr></table></div></figure>


<p>We may want to explicitly handle other kinds of errors as well, such as the 400 Bad Request errors that Flask generates for missing keys and the 500 Internal Server errors that are generated for uncaught exceptions:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@app.errorhandler</span><span class="p">(</span><span class="mi">400</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">key_error</span><span class="p">(</span><span class="n">e</span><span class="p">):</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;400.html&#39;</span><span class="p">),</span> <span class="mi">400</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nd">@app.errorhandler</span><span class="p">(</span><span class="mi">500</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">internal_server_error</span><span class="p">(</span><span class="n">e</span><span class="p">):</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;generic.html&#39;</span><span class="p">),</span> <span class="mi">500</span>
</span></code></pre></td></tr></table></div></figure>


<p>In addition to the HTTP errors that we might have to deal with, Flask also allows us to display different error pages when an uncaught exception bubbles up to its level.  For now, let&rsquo;s just register a generic error handler for all uncaught exceptions (but later we may want to register specific ones for more-common error conditions that we cannot do anything about):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@app.errorhandler</span><span class="p">(</span><span class="ne">Exception</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">unhandled_exception</span><span class="p">(</span><span class="n">e</span><span class="p">):</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="s">&#39;generic.html&#39;</span><span class="p">),</span> <span class="mi">500</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now all the most common cases of errors should be handled gracefully by our application.</p>

<p>However, we can do even better &ndash; let&rsquo;s ensure that <em>every</em> error is nicely styled we could register the same error handler for every possible error condition:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># flask_tracking/errors.py</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">current_app</span><span class="p">,</span> <span class="n">Markup</span><span class="p">,</span> <span class="n">render_template</span><span class="p">,</span> <span class="n">request</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">werkzeug.exceptions</span> <span class="kn">import</span> <span class="n">default_exceptions</span><span class="p">,</span> <span class="n">HTTPException</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">error_handler</span><span class="p">(</span><span class="n">error</span><span class="p">):</span>
</span><span class='line'>    <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Request resulted in {}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
</span><span class='line'>    <span class="n">current_app</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">exc_info</span><span class="o">=</span><span class="n">error</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">error</span><span class="p">,</span> <span class="n">HTTPException</span><span class="p">):</span>
</span><span class='line'>        <span class="n">description</span> <span class="o">=</span> <span class="n">error</span><span class="o">.</span><span class="n">get_description</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">environ</span><span class="p">)</span>
</span><span class='line'>        <span class="n">code</span> <span class="o">=</span> <span class="n">error</span><span class="o">.</span><span class="n">code</span>
</span><span class='line'>        <span class="n">name</span> <span class="o">=</span> <span class="n">error</span><span class="o">.</span><span class="n">name</span>
</span><span class='line'>    <span class="k">else</span><span class="p">:</span>
</span><span class='line'>        <span class="n">description</span> <span class="o">=</span> <span class="p">(</span><span class="s">&quot;We encountered an error &quot;</span>
</span><span class='line'>                       <span class="s">&quot;while trying to fulfill your request&quot;</span><span class="p">)</span>
</span><span class='line'>        <span class="n">code</span> <span class="o">=</span> <span class="mi">500</span>
</span><span class='line'>        <span class="n">name</span> <span class="o">=</span> <span class="s">&#39;Internal Server Error&#39;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># Flask supports looking up multiple templates and rendering the first</span>
</span><span class='line'>    <span class="c"># one it finds.  This will let us create specific error pages</span>
</span><span class='line'>    <span class="c"># for errors where we can provide the user some additional help.</span>
</span><span class='line'>    <span class="c"># (Like a 404, for example).</span>
</span><span class='line'>    <span class="n">templates_to_try</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;errors/{}.html&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">code</span><span class="p">),</span> <span class="s">&#39;errors/generic.html&#39;</span><span class="p">]</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">render_template</span><span class="p">(</span><span class="n">templates_to_try</span><span class="p">,</span>
</span><span class='line'>                           <span class="n">code</span><span class="o">=</span><span class="n">code</span><span class="p">,</span>
</span><span class='line'>                           <span class="n">name</span><span class="o">=</span><span class="n">Markup</span><span class="p">(</span><span class="n">name</span><span class="p">),</span>
</span><span class='line'>                           <span class="n">description</span><span class="o">=</span><span class="n">Markup</span><span class="p">(</span><span class="n">description</span><span class="p">),</span>
</span><span class='line'>                           <span class="n">error</span><span class="o">=</span><span class="n">error</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">init_app</span><span class="p">(</span><span class="n">app</span><span class="p">):</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">exception</span> <span class="ow">in</span> <span class="n">default_exceptions</span><span class="p">:</span>
</span><span class='line'>        <span class="n">app</span><span class="o">.</span><span class="n">register_error_handler</span><span class="p">(</span><span class="n">exception</span><span class="p">,</span> <span class="n">error_handler</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">app</span><span class="o">.</span><span class="n">register_error_handler</span><span class="p">(</span><span class="ne">Exception</span><span class="p">,</span> <span class="n">error_handler</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># This can be used in __init__ with a</span>
</span><span class='line'><span class="c"># import .errors</span>
</span><span class='line'><span class="c"># errors.init_app(app)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This ensures that all the HTTP error conditions that Flask knows how to handle (4XX and 5XX level errors) have the <code>error_handler</code> function registered as their handler.  Coupled with a <code>app.register_error_handler(Exception, error_handler)</code>, this will cover almost every error that our application might throw.  (There are a few exceptions, such as <code>SystemExit</code> that will not be caught this way and C-level segfaults or OS-level events will obviously not be caught and handled in this way, but those sorts of catastrophic events should be act-of-God occasions, not something that our application needs to be prepared to handle on a semi-regular basis).</p>

<a name="Logging"></a>
<h2>Logging</h2>

<p>Finally, let&rsquo;s talk about logging. Users will not always have enough time to reach out to us with a fully fleshed-out bug report (not to mention, bad actors will be actively looking for ways to take advantage of us.)  We need a way to ensure that we can look back in time and see what happened and when.</p>

<p>Fortunately, both Python and Flask have logging capabilities, so we do not need to re-invent the wheel here either.  A standard Python <code>logging</code> logger is available on the Flask object at <code>app.logger</code>.</p>

<p>The first place where we could use some logging is in our error handlers.  We don&rsquo;t need to log 404s as the proxy server will do that for us if we set it up right, but we will want to log the reasons for our other exceptions (400, 500 and Exception).  Let&rsquo;s go ahead and add some more detailed logging to those handlers.  Since we are doing using the same handler for all our errors, this is easy:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">error_handler</span><span class="p">(</span><span class="n">error</span><span class="p">):</span>
</span><span class='line'>    <span class="n">error_name</span> <span class="o">=</span> <span class="n">error</span><span class="o">.</span><span class="n">__name__</span> <span class="k">if</span> <span class="n">error</span> <span class="k">else</span> <span class="s">&quot;Unknown-Error&quot;</span>
</span><span class='line'>    <span class="n">app</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&#39;Request resulted in {}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error_name</span><span class="p">),</span> <span class="n">exc_info</span><span class="o">=</span><span class="n">error</span><span class="p">)</span>
</span><span class='line'>    <span class="c"># ... etc. ...</span>
</span></code></pre></td></tr></table></div></figure>


<p>Python&rsquo;s documentation on the logging module has a good breakdown of the various available <a href="http://docs.python.org/2/howto/logging.html#when-to-use-logging">logging levels</a> and what they are most appropriate for.</p>

<p>For those times when we don&rsquo;t have access to the <code>app</code> (say, inside of our <code>view</code> modules) we can use the thread-local <code>current_app</code> in the exact same way as we would use <code>app</code>.  For an example, let&rsquo;s also add a bit of logging to our login and logout handlers:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">current_app</span>
</span><span class='line'>
</span><span class='line'><span class="nd">@users.route</span><span class="p">(</span><span class="s">&#39;/logout/&#39;</span><span class="p">)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">logout_view</span><span class="p">():</span>
</span><span class='line'>    <span class="n">current_app</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Attempting to log out the current user&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="n">logout_user</span><span class="p">()</span>
</span><span class='line'>    <span class="n">current_app</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Successfully logged out the current user&#39;</span><span class="p">)</span>
</span><span class='line'>    <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;tracking.index&#39;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p><em>This code nicely demonstrates an issue we can run into with logging &ndash; having too much of it can be as bad as having too little.</em>  In this case, we have as much debugging code as we have application code, and it is difficult to follow the flow of the code any more.  We&rsquo;ll go ahead and remove this particular logging code, as it doesn&rsquo;t add anything above and beyond what we would see in our proxy server&rsquo;s access logs.</p>

<p>If we needed to log the entry and exit of each controller, we could add handlers for <a href="http://flask.pocoo.org/docs/api/#flask.Flask.before_request"><code>app.before_request</code></a> and <a href="http://flask.pocoo.org/docs/api/#flask.Flask.teardown_request"><code>app.teardown_request</code></a>. Just for fun, here&rsquo;s how we might log every access to our application:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@app.before_request</span>
</span><span class='line'><span class="k">def</span> <span class="nf">log_entry</span><span class="p">():</span>
</span><span class='line'>    <span class="n">context</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="s">&#39;url&#39;</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">path</span><span class="p">,</span>
</span><span class='line'>        <span class="s">&#39;method&#39;</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span><span class="p">,</span>
</span><span class='line'>        <span class="s">&#39;ip&#39;</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;REMOTE_ADDR&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">app</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Handling </span><span class="si">%(method)s</span><span class="s"> request from </span><span class="si">%(ip)s</span><span class="s"> for </span><span class="si">%(url)s</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we run our application in debug mode and access our home page then we will see:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="o">--------------------------------------------------------------------------------</span>
</span><span class='line'><span class="n">DEBUG</span> <span class="ow">in</span> <span class="n">__init__</span> <span class="p">[</span><span class="o">~/</span><span class="n">dev</span><span class="o">/</span><span class="n">flask</span><span class="o">-</span><span class="n">tracking</span><span class="o">/</span><span class="n">flask_tracking</span><span class="o">/</span><span class="n">__init__</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">68</span><span class="p">]:</span>
</span><span class='line'><span class="n">Handling</span> <span class="n">GET</span> <span class="n">request</span> <span class="kn">from</span> <span class="mf">127.0</span><span class="o">.</span><span class="mf">0.1</span> <span class="k">for</span> <span class="o">/</span>
</span><span class='line'><span class="o">--------------------------------------------------------------------------------</span>
</span></code></pre></td></tr></table></div></figure>


<p>As was said above, in production logging this sort of information would be duplicating the logs that our proxy server (Apache with mod_wsgi, ngnix with uwsgi, etc.) will be generating.  We should only do this if we are generating a unique value for each request that we absolutely need to keep track of.</p>

<a name="Adding.context.and.formatting.to.our.logs"></a>
<h3>Adding context and formatting to our logs</h3>

<p>However, it would be nice to have the context from our <code>log_entry</code> handler (above) in our exception handlers.  Let&rsquo;s go ahead and add a <a href="http://docs.python.org/2/library/logging.html#filter-objects"><code>Filter</code></a> instance to the logger to provide the url, method, IP address, and user id to all loggers that are interested in them (this is called <a href="http://docs.python.org/2/howto/logging-cookbook.html#filters-contextual">&ldquo;contextual logging&rdquo;</a>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># flask_tracking/logs.py</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">logging</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">ContextualFilter</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">Filter</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">log_record</span><span class="p">):</span>
</span><span class='line'>        <span class="n">log_record</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">path</span>
</span><span class='line'>        <span class="n">log_record</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span>
</span><span class='line'>        <span class="n">log_record</span><span class="o">.</span><span class="n">ip</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;REMOTE_ADDR&quot;</span><span class="p">)</span>
</span><span class='line'>        <span class="n">log_record</span><span class="o">.</span><span class="n">user_id</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="k">if</span> <span class="n">current_user</span><span class="o">.</span><span class="n">is_anonymous</span><span class="p">()</span> <span class="k">else</span> <span class="n">current_user</span><span class="o">.</span><span class="n">get_id</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="bp">True</span>
</span></code></pre></td></tr></table></div></figure>


<p>This filter doesn&rsquo;t actually filter any of our messages &ndash; instead, it provides some additional information that we can make use of in our logs.  Here&rsquo;s an example of how we might use this filter:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Create the filter and add it to the base application logger</span>
</span><span class='line'><span class="n">context_provider</span> <span class="o">=</span> <span class="n">ContextualFilter</span><span class="p">()</span>
</span><span class='line'><span class="n">app</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">addFilter</span><span class="p">(</span><span class="n">context_provider</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Optionally, remove Flask&#39;s default debug handler</span>
</span><span class='line'><span class="c"># del app.logger.handlers[:]</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Create a new handler for log messages that will send them to standard error</span>
</span><span class='line'><span class="n">handler</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">StreamHandler</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Add a formatter that makes use of our new contextual information</span>
</span><span class='line'><span class="n">log_format</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%(asctime)s</span><span class="se">\t</span><span class="si">%(levelname)s</span><span class="se">\t</span><span class="si">%(user_id)s</span><span class="se">\t</span><span class="si">%(ip)s</span><span class="se">\t</span><span class="si">%(method)s</span><span class="se">\t</span><span class="si">%(url)s</span><span class="se">\t</span><span class="si">%(message)s</span><span class="s">&quot;</span>
</span><span class='line'><span class="n">formatter</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">Formatter</span><span class="p">(</span><span class="n">log_format</span><span class="p">)</span>
</span><span class='line'><span class="n">handler</span><span class="o">.</span><span class="n">setFormatter</span><span class="p">(</span><span class="n">formatter</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Finally, attach the handler to our logger</span>
</span><span class='line'><span class="n">app</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And here&rsquo;s what a log message might look like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>2013-10-12 09:22:52,764    DEBUG   1   127.0.0.1   GET / Some additional message
</span></code></pre></td></tr></table></div></figure>


<p>One thing to note is that the message we pass to <code>app.logger.[LOGLEVEL]</code> is not expanded with the values in the context.  So if we had kept our <code>before_request</code> log call and changed our before request log call to just be-</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># Note the missing context argument</span>
</span><span class='line'><span class="n">app</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Handling </span><span class="si">%(method)s</span><span class="s"> request from </span><span class="si">%(ip)s</span><span class="s"> for </span><span class="si">%(url)s</span><span class="s">&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>-the format strings will be passed through unaltered.  But since we have them in our <a href="http://docs.python.org/2/library/logging.html#formatter-objects"><code>Formatter</code></a>, we can remove them from our individual message, leaving just:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@app.before_request</span>
</span><span class='line'><span class="k">def</span> <span class="nf">log_entry</span><span class="p">():</span>
</span><span class='line'>    <span class="n">app</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Handling request&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is the advantage of contextual logging &ndash; we can include important information in all our log entries without needing to collect it manually at the site of every log call.</p>

<a name="Directing.logs.to.different.places"></a>
<h3>Directing logs to different places</h3>

<p>Most of the information we will be logging is not immediately actionable.  However, there are certain kinds of errors we want to know about immediately.  A rash of 500 errors probably means that something is broken with our application, for example.  We cannot stay glued to our logs 24/7 so we need to have severe errors shipped to us.</p>

<p>Fortunately, adding new handlers to our application logger is easy &ndash; and since each handler can filter log entries down to only the ones it finds interesting, we can avoid getting deluged by logs, but still get alerts when something breaks horribly.</p>

<p>By way of an example, let&rsquo;s add another handler that will log ERROR and CRITICAL log messages to a special file.  This will not give us the alerting we want, but email or SMS setup depends on your host (we&rsquo;ll do such a setup in a later article for Heroku).  To whet your appetite see the example of how to log to email in <a href="http://flask.pocoo.org/docs/errorhandling/#error-mails">Flask&rsquo;s documentation on logging</a> or <a href="http://stackoverflow.com/q/8616617/135978">these recipes</a>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">logging</span> <span class="kn">import</span> <span class="n">ERROR</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">logging.handlers</span> <span class="kn">import</span> <span class="n">TimedRotatingFileHandler</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Only set up a file handler if we know where to put the logs</span>
</span><span class='line'><span class="k">if</span> <span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;ERROR_LOG_PATH&quot;</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># Create one file for each day. Delete logs over 7 days old.</span>
</span><span class='line'>    <span class="n">file_handler</span> <span class="o">=</span> <span class="n">TimedRotatingFileHandler</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s">&quot;ERROR_LOG_PATH&quot;</span><span class="p">],</span> <span class="n">when</span><span class="o">=</span><span class="s">&quot;D&quot;</span><span class="p">,</span> <span class="n">backupCount</span><span class="o">=</span><span class="mi">7</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># Use a multi-line format for this logger, for easier scanning</span>
</span><span class='line'>    <span class="n">file_formatter</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">Formatter</span><span class="p">(</span><span class="s">&#39;&#39;&#39;</span>
</span><span class='line'><span class="s">    Time: </span><span class="si">%(asctime)s</span><span class="s"></span>
</span><span class='line'><span class="s">    Level: </span><span class="si">%(levelname)s</span><span class="s"></span>
</span><span class='line'><span class="s">    Method: </span><span class="si">%(method)s</span><span class="s"></span>
</span><span class='line'><span class="s">    Path: </span><span class="si">%(url)s</span><span class="s"></span>
</span><span class='line'><span class="s">    IP: </span><span class="si">%(ip)s</span><span class="s"></span>
</span><span class='line'><span class="s">    User ID: </span><span class="si">%(user_id)s</span><span class="s"></span>
</span><span class='line'>
</span><span class='line'><span class="s">    Message: </span><span class="si">%(message)s</span><span class="s"></span>
</span><span class='line'>
</span><span class='line'><span class="s">    ---------------------&#39;&#39;&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># Filter out all log messages that are lower than Error.</span>
</span><span class='line'>    <span class="n">file_handler</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">ERROR</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">file_handler</span><span class="o">.</span><span class="n">addFormatter</span><span class="p">(</span><span class="n">file_formatter</span><span class="p">)</span>
</span><span class='line'>    <span class="n">app</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">file_handler</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we use this setup ERROR and CRITICAL log messages will appear both on the console and in the file specified in our configuration.</p>

<a name="Wrapping.Up"></a>
<h2>Wrapping Up</h2>

<p>We have covered a great deal in this article.</p>

<ol>
<li>Starting out with unit testing, we covered what testing is and why we need it.</li>
<li>We moved on to writing tests, both with and without mocks.</li>
<li>We briefly covered three methods of debugging errors locally (<code>print</code>, intentional errors to trigger Flask&rsquo;s debugger, and <code>pdb</code>.)</li>
<li>We covered error handling and ensured that our end users should only see styled error pages.</li>
<li>Finally, we went over logging setups.</li>
</ol>


<p>In Part IV we&rsquo;ll do some Test Driven Development to enable our application to accept payments and display simple reports.</p>

<p>In Part V we will write a RESTful JSON API for others to consume.</p>

<p>In Part VI we will cover automating deployments (on Heroku) with Fabric and basic A/B Feature Testing.</p>

<p>Finally, in Part VII we will cover preserving your application for the future with documentation, code coverage and quality metric tools.</p>

<p>As always, the code is available from <a href="https://github.com/mjhea0/flask-tracking">the repository</a>.  Looking forward to continuing this journey with you.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Working with Django and Flask on Nitrous.IO]]></title>
    <link href="https://realpython.com/blog/python/working-with-django-and-flask-on-nitrous-io/"/>
    <updated>2014-01-16T06:45:19-08:00</updated>
    <id>https://realpython.com/blog/python/working-with-django-and-flask-on-nitrous-io</id>
    <content type="html"><![CDATA[<p>This is a guest post by our friend Greg McKeever from <a href="http://www.nitrous.io?utm_source=realpython.com&amp;utm_medium=blog&amp;utm_content=nitrous_io_python_dev_environment">Nitrous.IO</a>.</p>

<hr>


<p>Nitrous.IO is a platform which allows you to spin up your own development environment quickly in the cloud. Here are a few key advantages of coding on <a href="http://www.nitrous.io?utm_source=realpython.com&amp;utm_medium=blog&amp;utm_content=nitrous_io_python_dev_environment">Nitrous.IO</a>:</p>

<ul>
<li><p>Save countless hours (or days) of setting up your Windows or Mac OS for development. Your Nitrous box comes pre-loaded with many <a href="http://help.nitrous.io/box-interpreters-and-tools/?utm_source=realpython.com&amp;utm_medium=blog&amp;utm_content=nitrous_io_python_dev_environment">tools and interpreters</a>, so you can start coding immediately.</p></li>
<li><p>Your code is accessible from any computer or mobile device. Edit code via Web IDE, SSH, or <a href="http://www.nitrous.io/mac?utm_source=realpython.com&amp;utm_medium=blog&amp;utm_content=nitrous_io_python_dev_environment">sync locally</a> and use your favorite text editor.</p></li>
<li><p>Collaboration: Nitrous provides a way for you to share your development environment with any other user. If you are running into any issues with your project and need help, you can invite a friend to your Nitrous box to edit and run your code.</p></li>
</ul>


<a name="Getting.Started"></a>
<h2>Getting Started</h2>

<p>To get started, sign up at <a href="http://www.nitrous.io?utm_source=realpython.com&amp;utm_medium=blog&amp;utm_content=nitrous_io_python_dev_environment">Nitrous.IO</a>. Once your account is confirmed, navigate to the <a href="https://www.nitrous.io/app#/boxes">boxes page</a> and create a new Python/Django box.</p>

<p><img src="https://realpython.com/images/blog_images/nitrous-create-python-box.png" alt="Create Python Box" /></p>

<p>There are many <a href="http://help.nitrous.io/box-interpreters-and-tools/?utm_source=realpython.com&amp;utm_medium=blog&amp;utm_content=nitrous_io_python_dev_environment">tools and interpreters</a> which are included with the Nitrous box, and at the time of writing this you will have Python 2.7.3 and Django 1.5.1 included with your dev environment. If this is what you are wanting to start working with then everything is ready to go!</p>

<p>If you are looking to use a different version of Python, Django, or utilize another framework such as Flask, keep reading.</p>

<a name="Setting.up.Python.2.7.with.Virtualenv"></a>
<h2>Setting up Python 2.7 with Virtualenv</h2>

<p>Virtualenv allows you to create an isolated environment in order to install specific versions of Python, Django, and also install other frameworks such as Flask without requiring root access. Since the Nitrous boxes do not offer root at this time, this is the best route to go.</p>

<p>To view the available versions of Python available, run <code>ls /usr/bin/python*</code> in the console. Create a new environment with Python 2.7 by running the following command:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>virtualenv -p /usr/bin/python2.7 py27env
</span></code></pre></td></tr></table></div></figure>


<p>You will now want to connect to this environment:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span><span class="nb">source </span>py27env/bin/activate
</span></code></pre></td></tr></table></div></figure>


<p><img src="https://realpython.com/images/blog_images/nitrous-virtual-env-python27.png" alt="Virtualenv" /></p>

<blockquote><p>If you decide you want to disconnect from this environment at any point, type <code>deactivate</code> in the console.</p></blockquote>

<p>Since you are in an isolated environment, you will need to install Django and any other dependencies that were available outside of your environment. You can check which modules are installed with <code>pip freeze</code>.</p>

<a name="Installing.Django"></a>
<h2>Installing Django</h2>

<p>To install the latest official version of Django, you will want to utilize pip:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>pip install Django
</span></code></pre></td></tr></table></div></figure>


<a name="Installing.Flask"></a>
<h2>Installing Flask</h2>

<p>Installing Flask is just as easy as installing Django with pip. Run the following command to install the latest official release:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>pip install Flask
</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s it! You can verify the installation by running the command <code>pip freeze</code>, and locating Flask in the list. You are now ready to start your course here at <a href="https://www.realpython.com/">RealPython</a>.</p>

<p>One thing to remember is that you can always disconnect from Virtualenv by running <code>deactivate</code> in the console. If you named your Virtualenv session &lsquo;py27env&rsquo; as seen in this article, you can always reconnect by running <code>source py27env/bin/activate</code>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Kickstarting a Django Open Source Project]]></title>
    <link href="https://realpython.com/blog/python/kickstarting-a-django-open-source-project/"/>
    <updated>2014-01-12T06:11:58-08:00</updated>
    <id>https://realpython.com/blog/python/kickstarting-a-django-open-source-project</id>
    <content type="html"><![CDATA[<p>This is a guest post by <a href="http://paltman.com/">Patrick Altman</a>, a passionate open source hacker, and VP of engineering at <a href="http://eldarion.com/">Eldarion</a>.</p>

<hr>


<p>In this article we will dissect a Django app boilerplate meant for quickly developing open source projects that adhere to widely shared conventions.</p>

<p>The layout (or pattern) that we will be looking at is based on <a href="https://github.com/eldarion/django-stripe-payments">django-stripe-payments</a>. This layout has proven successful for well over 100 different open source projects published by <a href="http://github.com/eldarion/">Eldarion</a> and <a href="http://github.com/pinax/">Pinax</a>.</p>

<p>As you go through this article, keep in mind that your specific project may vary from this pattern; however, there are a number of items that are fairly common across Python projects, and to some degree open source projects in general. We will focus on these items.</p>

<a name="Project.Layout"></a>
<h2>Project Layout</h2>

<p>A good project layout helps a new user navigate your source code. There are certain conventions that are commonly accepted as well that are important to abide by. In addition, a good project layout helps with packaging.</p>

<p>Project layouts will differ a bit depending on if they are Python packages (like a reusable Django app) or something like a Django project. Using our example project, we’d like to highlight some aspects of the layout as well as files included in the top level of the project.</p>

<p>You should reserve the root of your project for metadata files that describe various aspects of your project such as <code>LICENSE</code>, <code>CONTRIBUTING.md</code>, <code>README.rst</code>, as well as any scripts for running tests and packaging. In addition, there should be a folder in this root level that is named what you want the Python package name to be. In our <code>django-stripe-payments</code> example it is <code>payments</code>. Lastly, you should store your documentation as a Sphinx based project in a folder called <code>docs</code>.</p>

<a name="Licensing"></a>
<h3>Licensing</h3>

<p>It is generally best to license your software in the permissive MIT or BSD licenses if your goal is the most widespread adoption possible. The greater the adoption, the more exposure in varied real world environments which increases opportunity for feedback and cooperation via Pull requests. Store the contents of the license in a <code>LICENSE</code> file at the root of your project.</p>

<a name="README"></a>
<h3>README</h3>

<p>Every project should have a <code>README.rst</code> file in the project root. This document should briefly introduce the user to the project, describe what problem it solves, and provide a quick getting started guide.</p>

<p>Name it <code>README.rst</code> and put it at the root of your repo and GitHub will display it on your main project page for potential users to see and skim through to get a quick feel for how your software might help them.</p>

<blockquote><p>Using <a href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> instead of <a href="http://daringfireball.net/projects/markdown/">Markdown</a> in the readme is recommended  so that it displays nicely on <a href="https://pypi.python.org/pypi/">PyPI</a> if you publish your package.</p></blockquote>

<a name="Contributing.Guidelines"></a>
<h3>Contributing Guidelines</h3>

<p>A <code>CONTRIBUTING.md</code> file discusses the code style guide, processes, and guidelines for people wishing to contribute code through Pull Requests to your project. This is helpful in lowering the barrier for people wishing to contribute code. First time contributors might be nervous about doing something wrong or out of convention and the more detailed this document it is the more they can check themselves without having to ask questions that they might be too shy to ask.</p>

<a name="setup.py"></a>
<h3>setup.py</h3>

<p>Good packaging helps your project’s distribution. By writing a <code>setup.py</code> script, you can leverage Python’s packaging tools to create and publish your project on <a href="https://pypi.python.org/pypi/">PyPI</a>.</p>

<p>This is a really simple script. For example, here is the core of the script for django-stripe-payments:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">PACKAGE</span> <span class="o">=</span> <span class="s">&quot;payments&quot;</span>
</span><span class='line'><span class="n">NAME</span> <span class="o">=</span> <span class="s">&quot;django-stripe-payments&quot;</span>
</span><span class='line'><span class="n">DESCRIPTION</span> <span class="o">=</span> <span class="s">&quot;a payments Django app for Stripe&quot;</span>
</span><span class='line'><span class="n">AUTHOR</span> <span class="o">=</span> <span class="s">&quot;Patrick Altman&quot;</span>
</span><span class='line'><span class="n">AUTHOR_EMAIL</span> <span class="o">=</span> <span class="s">&quot;paltman@eldarion.com&quot;</span>
</span><span class='line'><span class="n">URL</span> <span class="o">=</span> <span class="s">&quot;https://github.com/eldarion/django-stripe-payments&quot;</span>
</span><span class='line'><span class="n">VERSION</span> <span class="o">=</span> <span class="nb">__import__</span><span class="p">(</span><span class="n">PACKAGE</span><span class="p">)</span><span class="o">.</span><span class="n">__version__</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">setup</span><span class="p">(</span>
</span><span class='line'><span class="err">    </span><span class="n">name</span><span class="o">=</span><span class="n">NAME</span><span class="p">,</span>
</span><span class='line'><span class="err">    </span><span class="n">version</span><span class="o">=</span><span class="n">VERSION</span><span class="p">,</span>
</span><span class='line'><span class="err">    </span><span class="n">description</span><span class="o">=</span><span class="n">DESCRIPTION</span><span class="p">,</span>
</span><span class='line'><span class="err">    </span><span class="n">long_description</span><span class="o">=</span><span class="n">read</span><span class="p">(</span><span class="s">&quot;README.rst&quot;</span><span class="p">),</span>
</span><span class='line'><span class="err">    </span><span class="n">author</span><span class="o">=</span><span class="n">AUTHOR</span><span class="p">,</span>
</span><span class='line'><span class="err">    </span><span class="n">author_email</span><span class="o">=</span><span class="n">AUTHOR_EMAIL</span><span class="p">,</span>
</span><span class='line'><span class="err">    </span><span class="n">license</span><span class="o">=</span><span class="s">&quot;BSD&quot;</span><span class="p">,</span>
</span><span class='line'><span class="err">    </span><span class="n">url</span><span class="o">=</span><span class="n">URL</span><span class="p">,</span>
</span><span class='line'><span class="err">    </span><span class="n">packages</span><span class="o">=</span><span class="n">find_packages</span><span class="p">(</span><span class="n">exclude</span><span class="o">=</span><span class="p">[</span><span class="s">&quot;tests.*&quot;</span><span class="p">,</span> <span class="s">&quot;tests&quot;</span><span class="p">]),</span>
</span><span class='line'><span class="err">    </span><span class="n">package_data</span><span class="o">=</span><span class="n">find_package_data</span><span class="p">(</span><span class="n">PACKAGE</span><span class="p">,</span> <span class="n">only_in_packages</span><span class="o">=</span><span class="bp">False</span><span class="p">),</span>
</span><span class='line'><span class="err">    </span><span class="n">classifiers</span><span class="o">=</span><span class="p">[</span>
</span><span class='line'><span class="err">        </span><span class="s">&quot;Development Status :: 3 - Alpha&quot;</span><span class="p">,</span>
</span><span class='line'><span class="err">        </span><span class="s">&quot;Environment :: Web Environment&quot;</span><span class="p">,</span>
</span><span class='line'><span class="err">        </span><span class="s">&quot;Intended Audience :: Developers&quot;</span><span class="p">,</span>
</span><span class='line'><span class="err">        </span><span class="s">&quot;License :: OSI Approved :: BSD License&quot;</span><span class="p">,</span>
</span><span class='line'><span class="err">        </span><span class="s">&quot;Operating System :: OS Independent&quot;</span><span class="p">,</span>
</span><span class='line'><span class="err">        </span><span class="s">&quot;Programming Language :: Python&quot;</span><span class="p">,</span>
</span><span class='line'><span class="err">        </span><span class="s">&quot;Framework :: Django&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="err">    </span><span class="p">],</span>
</span><span class='line'><span class="err">    </span><span class="n">install_requires</span><span class="o">=</span><span class="p">[</span>
</span><span class='line'><span class="err">        </span><span class="s">&quot;django-jsonfield&gt;=0.8&quot;</span><span class="p">,</span>
</span><span class='line'><span class="err">        </span><span class="s">&quot;stripe&gt;=1.7.9&quot;</span><span class="p">,</span>
</span><span class='line'><span class="err">        </span><span class="s">&quot;django&gt;=1.4&quot;</span><span class="p">,</span>
</span><span class='line'><span class="err">        </span><span class="s">&quot;pytz&quot;</span>
</span><span class='line'>    <span class="err">    </span><span class="p">],</span>
</span><span class='line'><span class="err">    </span><span class="n">zip_safe</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
</span><span class='line'>    <span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are several things going on here. Remember how we discussed making the <code>README.rst</code> file reStructuredText? That is because as you can see for the <code>long_description</code> we are using the contents of that file to populate the landing page on PyPI and that’s the markup language used there. The classifiers are a set of metadata that help put your project in the right categories on PyPI. Finally, the <code>install_requires</code> argument will make sure when your package is installed that these listed dependancies get installed or are already installed.</p>

<a name="GitHub"></a>
<h2>GitHub</h2>

<p>If your project is not on <a href="http://github.com">GitHub</a> you are really missing out. Sure there are other web based DVCS (distributed version control system) sites that offer free open source hosting but none have done more for open source than GitHub.</p>

<a name="Handling.Pull.Requests"></a>
<h3>Handling Pull Requests</h3>

<p>Part of building a great open source project is making it bigger than yourself. This involves not only increasing merely the user base but also the contributor base. GitHub (and git in general) has really transformed how this is done.</p>

<p>One key to increasing contributors is to be responsive in managing Pull requests. This doesn&rsquo;t mean accepting every contribution but also remain open minded and handle responses with the deference you would like to receive if you were contributing to another project.</p>

<p>Do not just close requests that you don&rsquo;t want but take the time to explain why you won&rsquo;t accept them, or if possible explain how they can be improved so they can be excepted. If the improvements are minor or you can otherwise improve upon them yourself, go ahead and accept it and then make the corrections you&rsquo;d like. There is a fine line between asking for improvements versus just doing them yourself.</p>

<p>The guiding principal is to create a welcoming and grateful atmosphere. Remember your contributors are volunteering their time and energy to improve your project.</p>

<a name="Versioning..Branching..and.Releases"></a>
<h3>Versioning, Branching, and Releases</h3>

<p>Read and follow <a href="http://semver.org">Semantic Versioning</a> when creating releases.</p>

<p>When you do major releases always document clearly backward incompatible changes. It&rsquo;s easiest if your document changes as you are committing them by updating a change log file as you work between releases. This file could simply be a CHANGELOG file at the root of your project, or part of your documentation in a file somewhere like <code>docs/changelog.rst</code>. This will enable you to create nice Release Notes with very little effort.</p>

<p>Keep the master stable. There is always the chance that people will use code on master instead of a packages release. Create feature branches for work and merge when it&rsquo;s tested and relatively stable.</p>

<a name="Documentation"></a>
<h2>Documentation</h2>

<p>No project is fully complete until there is some amount of documentation. Good documentation saves users from having to read source code to determine how to use your software. Good documentation communicates that you care about your users.</p>

<p>With <a href="https://readthedocs.org">Read The Docs</a>, you can have your documentation automatically rendered and hosted for free. It will automatically update on every commit to master which is super cool.</p>

<p>In order to use Read the Docs, you should create a <a href="http://sphinx-doc.org/">Sphinx</a> based documentation project in the <code>docs</code> folder at the root of your project. This really is a pretty simple thing and consists of a <code>Makefile</code> and a <code>conf.py</code> file and then a collection of reStructuredText formatted files. You can do this manually by copying and pasting the <code>Makefile</code> and <code>conf.py</code> file from a previous project and modifying the values, or by running:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>pip install Sphinx
</span><span class='line'><span class="nv">$ </span>sphinx-quickstart
</span></code></pre></td></tr></table></div></figure>


<a name="Automating.Code.Quality"></a>
<h2>Automating Code Quality</h2>

<p>There are a number of tools you can use to help keep quality in check on your projects. Linting, testing, and test coverage should all be used to help insure quality doesn’t drift over the life of the project.</p>

<p>Start with linting with something like <code>pylint</code> or <code>pep8</code> or <code>pyflakes</code>. They all have their pros and cons which are beyond the scope of this article to explore. Point being: consistent style is the first step in a high quality project. In addition, helping with style these linters can help identify some simple bugs quickly.</p>

<p>For example, for <code>django-stripe-payments</code>, we have a script that  combines running two different lint tools with customized exceptions for our project:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="c"># lint.sh</span>
</span><span class='line'>pylint --rcfile<span class="o">=</span>.pylintrc payments <span class="o">&amp;&amp;</span> pep8 --ignore<span class="o">=</span>E501 payments
</span></code></pre></td></tr></table></div></figure>


<p>Take a look at the <code>.pylintrc</code> file in the <code>django-stripe-payments</code> repo for examples of some of the exceptions. One thing about <code>pylint</code> is that it&rsquo;s pretty aggressive and can be noisy with things are that are really not problematic. You need to decide for yourself to tune your own <code>.pylintrc</code> file but I recommend documenting the file so you know later why you are excluding certain rules.</p>

<p>Setting up a good testing infrastructure is important in proving that your code works. Furthermore, writing some of your tests first can help you think through your API. Even if you write tests last, the act of writing tests will expose weak spots in your API design and/or other usability issues that you can address before they are reported.</p>

<p>Part of your testing infrastructure should involve using coverage.py to keep an eye on a module’s coverage. This tool won’t tell you if code is tested, only you can do that, but it will help identify code that isn’t executed at all so you know what code is definitely not being tested.</p>

<p>Once you have linting, testing and coverage scripts integrated into your project you can setup automation so that these tools execute on every push in one more environments (e.g. different versions of Python, different versions of Django, or both in a test matrix).</p>

<p>Setting up a <a href="https://travis-ci.org/">Travis</a> integration can automatically execute tests and linters. <a href="https://coveralls.io/">Coveralls</a> can be added to this configuration to provide historical testing coverage when Travis builds run. Both have features that enable you to embed a badge in your README.md to show off latest build status and coverage.</p>

<a name="Collaboration.versus.cooperation"></a>
<h2>Collaboration versus cooperation</h2>

<p>During DjangoCon 2011, <a href="http://eaves.ca/">David Eaves</a> gave a <a href="https://www.youtube.com/watch?v=SzGi1DfbZMI">keynote address</a> that eloquently put into words the notion that although collaboration and cooperation have similar definitions, there is a subtle difference:</p>

<p>&ldquo;I would argue that collaboration, unlike cooperation, requires the parties involved in a project jointly solve problems.&rdquo;</p>

<p>Eaves goes on to devote an entire post specifically to how GitHub was the driving force for innovating how open source works—specifically, the aspect of community management. In &ldquo;How GitHub Saved OpenSource&rdquo; (see Resources), Eaves states:</p>

<p>&ldquo;I believe open source projects work best when contributors are able to engage in low transaction cost cooperation and high transaction cost collaboration is minimized. The genius of open source is that it does not require a group to debate every issue and work on problems collectively, quite the opposite.&rdquo;</p>

<p>He goes on to talk about the value of forking and how it reduces the high costs of collaboration by enabling low-cost cooperation among people able to take projects forward without permission. This forking pushes off the need for coordination until solutions are ready to be merged in, enabling much more rapid and dynamic experimentation.</p>

<p>You can shape your project in similar ways, with the same goal of increasing low-cost cooperation while minimizing expensive collaboration throughout writing, maintaining, and supporting your project by following the conventions and patterns detailed in this post.</p>

<a name="Summary"></a>
<h2>Summary</h2>

<p>A lot was covered here with little actual examples. The best way to learn about these things in detail is to browse the repositories on GitHub of projects that do a good job on these patterns. Pinax has their own boilerplate <a href="https://github.com/pinax/pinax-starter-app">here</a>, which can be used to quickly generate a Project based on the conventions and patterns found in this post. Keep in mind, that even if you go with our boilerplate or some other boilerplate, you will need to find a style in implementing these things that fits you and your project. All of these things are in addition to writing the actual code of your project&mdash;but they all help in growing a community of contributors.</p>
]]></content>
  </entry>
  
</feed>
