20 lines
9.4 KiB
HTML
20 lines
9.4 KiB
HTML
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="X-UA-Compatible" content="IE=edge"><title> Flask Day 2 · MarkDown</title><meta name="description" content="Flask Day 2 - Ching"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="short icon" href="/favicon.png"><link rel="stylesheet" href="/css/apollo.css"><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600" type="text/css"><meta name="generator" content="Hexo 6.0.0"><link rel="alternate" href="/atom.xml" title="MarkDown" type="application/atom+xml">
|
||
</head><body><header><a href="/" class="logo-link"><img src="/logo.png"></a><ul class="nav nav-list"><li class="nav-list-item"><a href="/" target="_self" class="nav-list-link">ALL</a></li><li class="nav-list-item"><a href="/categories/leetcode/" target="_self" class="nav-list-link">LEETCODE</a></li><li class="nav-list-item"><a href="/atom.xml" target="_self" class="nav-list-link">RSS</a></li></ul></header><section class="container"><div class="post"><article class="post-block"><h1 class="post-title">Flask Day 2</h1><div class="post-meta"><div class="post-time">2016年2月16日</div></div><div class="post-content"><p>To handle web forms we use <a target="_blank" rel="noopener" href="http://packages.python.org/Flask-WTF">Flask-WTF </a>. So we need to write a config file (file <code>config.py</code>):</p>
|
||
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">WTF_CSRF_ENABLED = <span class="literal">True</span></span><br><span class="line">SECRET_KEY = <span class="string">'you-will-never-guess'</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>And then you need to use this config (file <code>app/__init__.py</code>):</p>
|
||
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> flask <span class="keyword">import</span> Flask</span><br><span class="line"></span><br><span class="line">app = Flask(__name__)</span><br><span class="line">app.config.from_object(<span class="string">'config'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> app <span class="keyword">import</span> views</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>Let’s build a simple form (file <code>app/forms.app</code>):</p>
|
||
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> flask.ext.wtf <span class="keyword">import</span> Form</span><br><span class="line"><span class="keyword">from</span> wtforms <span class="keyword">import</span> StringField, BooleanField</span><br><span class="line"><span class="keyword">from</span> wtforms.validators <span class="keyword">import</span> DataRequired</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">LoginForm</span>(<span class="params">Form</span>):</span></span><br><span class="line"> openid = StringField(<span class="string">'openid'</span>, validators=[DataRequired()])</span><br><span class="line"> remember_me = BooleanField(<span class="string">'remember_me'</span>, default=<span class="literal">False</span>)</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>The <code>DataRequired()</code> is a validator that checks the field is empty or not.</p>
|
||
<p>After that, we need a HTML page to show the form (file <code>app/templates/login.html</code>):</p>
|
||
<figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!-- extend from base layout --></span></span><br><span class="line">{% extends "base.html" %}</span><br><span class="line"></span><br><span class="line">{% block content %}</span><br><span class="line"> <span class="tag"><<span class="name">h1</span>></span>Sign In<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">form</span> <span class="attr">action</span>=<span class="string">""</span> <span class="attr">method</span>=<span class="string">"post"</span> <span class="attr">name</span>=<span class="string">"login"</span>></span></span><br><span class="line"> {{ form.hidden_tag() }}</span><br><span class="line"> <span class="tag"><<span class="name">p</span>></span></span><br><span class="line"> Please enter your OpenID:<span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> {{ form.openid(size=80) }}<span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span>></span>{{ form.remember_me }} Remember Me<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span>></span><span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"submit"</span> <span class="attr">value</span>=<span class="string">"Sign In"</span>></span><span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">form</span>></span></span><br><span class="line">{% endblock %}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<p>The final step is to code a view function that renders the template and receiving data from form (file <code>app/views.py</code>):</p>
|
||
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> flask <span class="keyword">import</span> render_template, flash, redirect</span><br><span class="line"><span class="keyword">from</span> app <span class="keyword">import</span> app</span><br><span class="line"><span class="keyword">from</span> .forms <span class="keyword">import</span> LoginForm</span><br><span class="line"></span><br><span class="line"><span class="comment"># index view function suppressed for brevity</span></span><br><span class="line"></span><br><span class="line">app.route(<span class="string">'/login'</span>, methods=[<span class="string">'GET'</span>, <span class="string">'POST'</span>])</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">login</span>():</span></span><br><span class="line"> form = LoginForm()</span><br><span class="line"> <span class="keyword">if</span> form.validate_on_submit():</span><br><span class="line"> flash(<span class="string">'Login requested for OpenID="%s", remember_me=%s'</span> %</span><br><span class="line"> (form.openid.data, <span class="built_in">str</span>(form.remember_me.data)))</span><br><span class="line"> <span class="keyword">return</span> redirect(<span class="string">'/index'</span>)</span><br><span class="line"> <span class="keyword">return</span> render_template(<span class="string">'login.html'</span>, </span><br><span class="line"> title=<span class="string">'Sign In'</span>,</span><br><span class="line"> form=form)</span><br></pre></td></tr></table></figure>
|
||
|
||
</div></article></div></section><footer><div class="paginator"><a href="/2016/04/25/Django-Manager-Method/" class="prev">PRVE</a><a href="/2016/02/15/Flask-Day-1/" class="next">NEXT</a></div><div class="copyright"><p>© 2016 - 2022 <a href="http://blog.tunpok.com">Ching</a>, unless otherwise noted.</p></div></footer><script src="https://cdn.bootcss.com/mathjax/2.5.3/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script></body></html> |