表单 Flask-WTF

项目结构

  1. pip install flask-wtf

为了实现CSRF 保护,Flask-WTF 需要程序设置一个密钥。Flask-WTF 使用这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪。

为了增强安全性,密钥不应该直接写入代码,而要保存在环境变量中。

首先,导入flask_wtf库,并从中引入FlaskFrom类,如下所示:

  1. from flask_wtf import FlaskForm

表单的字段、验证函数,需要从wtforms库导入

  1. from wtforms import StringField,SubmitField
  2. from wtforms.validators import Required

表单类

表单类

LoginForms.py

  1. from flask_wtf import FlaskForm
  2. from wtforms import StringField,SubmitField
  3. from wtforms.validators import Required
  4.  
  5. class LoginForm(FlaskForm):
  6. name = StringField('请输入你的姓名:')
  7. submit = SubmitField('提交')

index.py

  1. from flask import Flask,render_template
  2. from flask_bootstrap import Bootstrap
  3. from flask import request,url_for
  4. from flask_moment import Moment
  5. from datetime import datetime
  6. from wtforms import StringField,SubmitField
  7. from wtforms.validators import DataRequired
  8. from app.Views.LoginForm import LoginForm
  9. from flask import redirect,session
  10. from flask import flash
  11. #初始化
  12. app = Flask(__name__)
  13. bootstrap = Bootstrap(app)
  14. app.config['SECRET_KEY'] = 'hard to guess string'
  15. # 初始化实例
  16. moment = Moment(app)
  17.  
  18. #路由,处理URL 和函数之间关系的程序称为路由
  19. @app.route('/',methods=['GET','POST'])
  20. #视图函数,函数执行,返回结果
  21. def index():
  22. name = None
  23. form = LoginForm()
  24. if form.validate_on_submit():
  25. name = form.name.data
  26. form.name.data = ''return render_template('index.html',form=form,name=name))
  27. #启动服务器
  28. if __name__ == '__main__':
  29. app.run()

把表单渲染成HTML

base.html

  1. {% extends "bootstrap/base.html" %}
  2. {% import "bootstrap/wtf.html" as wtf %}
  3. {% block title %}Flasky{% endblock %}
  4. {#包含导航条的程序基模板#}
  5. {% block navbar %}
  6. <div class="navbar navbar-inverse" role="navigation">
  7. <div class="container">
  8. <div class="navbar-header">
  9. <button type="button" class="navbar-toggle"
  10. data-toggle="collapse" data-target=".navbar-collapse">
  11. <span class="sr-only">Toggle navigation</span>
  12. <span class="icon-bar"></span>
  13. <span class="icon-bar"></span>
  14. <span class="icon-bar"></span>
  15. </button>
  16. <a class="navbar-brand" href="/">TEST</a>
  17. </div>
  18. <div class="navbar-collapse collapse">
  19. <ul class="nav navbar-nav">
  20. <li><a href="/">Home</a></li>
  21. </ul>
  22. </div>
  23. </div>
  24. </div>
  25. {% endblock %}
  26. {% block content %}
  27. <div class="container">
  28. {% block page_content %}{% endblock %}
  29. </div>
  30. {% endblock %}

index.html

  1. {% extends "base.html" %}
  2. {% block title %}IndexTitle{% endblock %}
  3. <div class="container">
  4. {% block page_content %}
  5. <h1>Hello Flask!</h1>
  6. {# <p>本地时间格式化:{{ moment(current_time).format('YYYY-MM-DD HH:mm:ss') }}.</p>#}
  7. {# <p>本地时间格式化:{{ moment(current_time).format('YYYY-MM-DD') }}.</p>#}
  8. {# <p>本地时间格式化:{{ moment(current_time).format('YYYY') }}.</p>#}
  9. {{ wtf.quick_form(form) }}
  10. 你刚输入的姓名是:
  11. {{ name }}
  12. {% endblock %}
  13. </div>

从零开始学Flask框架-005的更多相关文章

  1. 从零开始学Flask框架-004

    Flask-Moment pip install flask-moment 除了moment.js,Flask-Moment 还依赖jquery.js.但是Bootstrap 已经引入了jquery. ...

  2. 从零开始学Flask框架-007

    Flash消息 from flask import flash 渲染Flash消息,在基模板base.html中引入get_flashed_messages() {% extends "bo ...

  3. 从零开始学Flask框架-006

    重定向和用户会话 因为刷新页面时浏览器会重新发送之前已经发送过的最后一个请求.如果这个请求是一个包含表单数据的POST 请求,刷新页面后会再次提交表单. 基于这个原因,最好别让Web 程序把POST ...

  4. 从零开始学Flask框架-003

    index.py from flask import Flask,render_template from flask_bootstrap import Bootstrap #初始化 app = Fl ...

  5. 从零开始学Flask框架-002

    Jinja2模板 默认情况下,Flask 在程序文件夹中的templates 子文件夹中寻找模板. Jinja2 中的extends 指令从Flask-Bootstrap 中导入bootstrap/b ...

  6. 从零开始学Flask框架-001

    新建项目 目录结构 Index.html <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  7. 从零开始学Flask框架-008

    数据库 安装Flask-SQLAlchemy扩展库 pip install flask-sqlalchemy 引入SQLAlchemy类 from flask_sqlalchemy import SQ ...

  8. 从零开始学 Java - 搭建 Spring MVC 框架

    没有什么比一个时代的没落更令人伤感的了 整个社会和人都在追求创新.进步.成长,没有人愿意停步不前,一个个老事物慢慢从我们生活中消失掉真的令人那么伤感么?或者说被取代?我想有些是的,但有些东西其实并不是 ...

  9. 4. 使用别的json解析框架【从零开始学Spring Boot】

    转载:http://blog.csdn.net/linxingliang/article/details/51585921 此文章已经废弃,请看新版的博客的完美解决方案: 78. Spring Boo ...

随机推荐

  1. 范仁义web前端介绍课程---4、html、css、js初体验

    范仁义web前端介绍课程---4.html.css.js初体验 一.总结 一句话总结: html:就是网站的骨架,比如div标签.a标签等 css:style标签或者style属性里面的就是css j ...

  2. 免费s账号网站

    下面网址按排序顺序优先使用,数字越小优先级越高 1,https://io.freess.today/ 2,https://free-ss.site/ 3,https://ss.freess.org/ ...

  3. 一个java创建,删除,构建Jenkins等功能的JenkinsUtil工具类

    package com.vip.webpagetest.utils; import java.io.InputStream;import java.util.ArrayList;import java ...

  4. 多层nginx中的压缩问题 api接口>1M数据的返回浏览器 网关

    基础 前端异步请求,局部刷新,加大最大等待时间 nginx开启压缩 进阶 多级nginx的压缩 实践测试: 每级都要开启压缩 gizp on: 最外层开启,但最内层没有开启 最外层没有开启 最外层.最 ...

  5. laravel打印sql所执行的原生语句

    DB::listen(function($sql) { foreach ($sql->bindings as $i => $binding) { if ($binding instance ...

  6. kotlin单个文件及文件夹复制例子

    最近学习kotlin,把java中的单个文件及包含文件夹的文件 复制操作改写为kotlin的代码,主要熟悉kotlin文件操作以及递归调用操作方法 演示代码如下: package com.exam.f ...

  7. Leetcode: Stream of Characters

    Implement the StreamChecker class as follows: StreamChecker(words): Constructor, init the data struc ...

  8. typescript装饰器定义 类装饰器 属性装饰器 装饰器工厂

    /* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...

  9. pytorch设置多GPU运行的方法

    1.DataParallel layers (multi-GPU, distributed) 1)DataParallel CLASS torch.nn.DataParallel(module, de ...

  10. JS 数字相加出现多个小数的问题

    今天在页面上用到了js进行小数相加119.01+0.01,结果大家都知道应该是:119.02的,然而结果是119..0200000…. ,莫名其妙的,还以为是我写的程序有问题,后来查了下才知道这是ja ...