从零开始学Flask框架-005
表单 Flask-WTF
项目结构
- pip install flask-wtf
为了实现CSRF 保护,Flask-WTF 需要程序设置一个密钥。Flask-WTF 使用这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪。
为了增强安全性,密钥不应该直接写入代码,而要保存在环境变量中。
首先,导入flask_wtf库,并从中引入FlaskFrom类,如下所示:
- from flask_wtf import FlaskForm
表单的字段、验证函数,需要从wtforms库导入
- from wtforms import StringField,SubmitField
- from wtforms.validators import Required
表单类
表单类
LoginForms.py
- from flask_wtf import FlaskForm
- from wtforms import StringField,SubmitField
- from wtforms.validators import Required
- class LoginForm(FlaskForm):
- name = StringField('请输入你的姓名:')
- submit = SubmitField('提交')
index.py
- from flask import Flask,render_template
- from flask_bootstrap import Bootstrap
- from flask import request,url_for
- from flask_moment import Moment
- from datetime import datetime
- from wtforms import StringField,SubmitField
- from wtforms.validators import DataRequired
- from app.Views.LoginForm import LoginForm
- from flask import redirect,session
- from flask import flash
- #初始化
- app = Flask(__name__)
- bootstrap = Bootstrap(app)
- app.config['SECRET_KEY'] = 'hard to guess string'
- # 初始化实例
- moment = Moment(app)
- #路由,处理URL 和函数之间关系的程序称为路由
- @app.route('/',methods=['GET','POST'])
- #视图函数,函数执行,返回结果
- def index():
- name = None
- form = LoginForm()
- if form.validate_on_submit():
- name = form.name.data
- form.name.data = ''return render_template('index.html',form=form,name=name))
- #启动服务器
- if __name__ == '__main__':
- app.run()
把表单渲染成HTML
base.html
- {% extends "bootstrap/base.html" %}
- {% import "bootstrap/wtf.html" as wtf %}
- {% block title %}Flasky{% endblock %}
- {#包含导航条的程序基模板#}
- {% block navbar %}
- <div class="navbar navbar-inverse" role="navigation">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle"
- data-toggle="collapse" data-target=".navbar-collapse">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <a class="navbar-brand" href="/">TEST</a>
- </div>
- <div class="navbar-collapse collapse">
- <ul class="nav navbar-nav">
- <li><a href="/">Home</a></li>
- </ul>
- </div>
- </div>
- </div>
- {% endblock %}
- {% block content %}
- <div class="container">
- {% block page_content %}{% endblock %}
- </div>
- {% endblock %}
index.html
- {% extends "base.html" %}
- {% block title %}IndexTitle{% endblock %}
- <div class="container">
- {% block page_content %}
- <h1>Hello Flask!</h1>
- {# <p>本地时间格式化:{{ moment(current_time).format('YYYY-MM-DD HH:mm:ss') }}.</p>#}
- {# <p>本地时间格式化:{{ moment(current_time).format('YYYY-MM-DD') }}.</p>#}
- {# <p>本地时间格式化:{{ moment(current_time).format('YYYY') }}.</p>#}
- {{ wtf.quick_form(form) }}
- 你刚输入的姓名是:
- {{ name }}
- {% endblock %}
- </div>
从零开始学Flask框架-005的更多相关文章
- 从零开始学Flask框架-004
Flask-Moment pip install flask-moment 除了moment.js,Flask-Moment 还依赖jquery.js.但是Bootstrap 已经引入了jquery. ...
- 从零开始学Flask框架-007
Flash消息 from flask import flash 渲染Flash消息,在基模板base.html中引入get_flashed_messages() {% extends "bo ...
- 从零开始学Flask框架-006
重定向和用户会话 因为刷新页面时浏览器会重新发送之前已经发送过的最后一个请求.如果这个请求是一个包含表单数据的POST 请求,刷新页面后会再次提交表单. 基于这个原因,最好别让Web 程序把POST ...
- 从零开始学Flask框架-003
index.py from flask import Flask,render_template from flask_bootstrap import Bootstrap #初始化 app = Fl ...
- 从零开始学Flask框架-002
Jinja2模板 默认情况下,Flask 在程序文件夹中的templates 子文件夹中寻找模板. Jinja2 中的extends 指令从Flask-Bootstrap 中导入bootstrap/b ...
- 从零开始学Flask框架-001
新建项目 目录结构 Index.html <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- 从零开始学Flask框架-008
数据库 安装Flask-SQLAlchemy扩展库 pip install flask-sqlalchemy 引入SQLAlchemy类 from flask_sqlalchemy import SQ ...
- 从零开始学 Java - 搭建 Spring MVC 框架
没有什么比一个时代的没落更令人伤感的了 整个社会和人都在追求创新.进步.成长,没有人愿意停步不前,一个个老事物慢慢从我们生活中消失掉真的令人那么伤感么?或者说被取代?我想有些是的,但有些东西其实并不是 ...
- 4. 使用别的json解析框架【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/51585921 此文章已经废弃,请看新版的博客的完美解决方案: 78. Spring Boo ...
随机推荐
- 范仁义web前端介绍课程---4、html、css、js初体验
范仁义web前端介绍课程---4.html.css.js初体验 一.总结 一句话总结: html:就是网站的骨架,比如div标签.a标签等 css:style标签或者style属性里面的就是css j ...
- 免费s账号网站
下面网址按排序顺序优先使用,数字越小优先级越高 1,https://io.freess.today/ 2,https://free-ss.site/ 3,https://ss.freess.org/ ...
- 一个java创建,删除,构建Jenkins等功能的JenkinsUtil工具类
package com.vip.webpagetest.utils; import java.io.InputStream;import java.util.ArrayList;import java ...
- 多层nginx中的压缩问题 api接口>1M数据的返回浏览器 网关
基础 前端异步请求,局部刷新,加大最大等待时间 nginx开启压缩 进阶 多级nginx的压缩 实践测试: 每级都要开启压缩 gizp on: 最外层开启,但最内层没有开启 最外层没有开启 最外层.最 ...
- laravel打印sql所执行的原生语句
DB::listen(function($sql) { foreach ($sql->bindings as $i => $binding) { if ($binding instance ...
- kotlin单个文件及文件夹复制例子
最近学习kotlin,把java中的单个文件及包含文件夹的文件 复制操作改写为kotlin的代码,主要熟悉kotlin文件操作以及递归调用操作方法 演示代码如下: package com.exam.f ...
- Leetcode: Stream of Characters
Implement the StreamChecker class as follows: StreamChecker(words): Constructor, init the data struc ...
- typescript装饰器定义 类装饰器 属性装饰器 装饰器工厂
/* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...
- pytorch设置多GPU运行的方法
1.DataParallel layers (multi-GPU, distributed) 1)DataParallel CLASS torch.nn.DataParallel(module, de ...
- JS 数字相加出现多个小数的问题
今天在页面上用到了js进行小数相加119.01+0.01,结果大家都知道应该是:119.02的,然而结果是119..0200000…. ,莫名其妙的,还以为是我写的程序有问题,后来查了下才知道这是ja ...