首页 技术 正文
技术 2022年11月18日
0 收藏 705 点赞 4,733 浏览 2331 个字

web表单

pip install flask-wtf

实现csrf保护

app.config['SECRET_KEY']='hard to guess string' # 可以用来存储框架,扩展,程序等的配置变量
#支持的字段
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密码文本字段
HiddenField 隐藏文本字段
DateField 文本字段,值为datetime.date格式
DateTimeField 文本字段,值为datetime.datetime格式
IntegerField 文本字段,值为整数
DecimalField 文本字段,值为decimal.Decimal
FloatField 文本字段,值为浮点数
BooleanField 复选框
RadioField 一组单选框
SelectField 下拉列表
SelectMultipleField 下拉列表,可选择多个值
FileField 文本上传字段
SubmitField 表单提交
FormField 把表单作为字段嵌入另一个表单
FieldList 一组指定类型的字段
#验证函数
Email 验证电子邮件地址
EqualTo 比较两字段值,常用于要求输入两次密码确认
IPAddress 验证IPv4网络地址
Length 验证输入字符串长度
NumberRange 验证输入的值在数字范围内
Optional 无输入值时跳过其他验证函数
Required 确保字段中的数据
Regexp 使用正则表达式验证输入值
URL 验证URL
AnyOf 确保输入值在可选值列表中
NoneOf 确保输入值不在可选值列表中
# app.py
from flask_wtf import FlaskForm
from wtforms import StringField,SubmitField
from wtforms.validators import DataRequiredapp.config['SECRET_KEY']='hard to guess string' # 可以用来存储框架,扩展,程序等的配置变量class NameForm(FlaskForm):
name = StringField('姓名',validators=[DataRequired()])
submit = SubmitField('提交')
@app.route ('/',methods=['get','post'])
def index1():
name=None
form=NameForm()
if form.validate_on_submit():
name=form.name.data
form.name.data=''
return render_template('index.html',name=name,form=form,current_time = datetime.utcnow())
# if
<h1>Hello,{% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1>
# 利用bootstrap form渲染表单
{{ wtf.quick_form(form) }}

重定向,会话,flash消息

from flask import Flask, render_template,session,redirect,url_for,flash
from flask_bootstrap import Bootstrap
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequiredapp = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string' # 可以用来存储框架,扩展,程序等的配置变量class NameForm(FlaskForm):
name = StringField('姓名', validators=[DataRequired()])
submit = SubmitField('提交')bootstrap = Bootstrap(app)
moment = Moment(app)@app.route('/', methods=['get', 'post'])
def index1():
name = None
form = NameForm()
if form.validate_on_submit():
old_name = session.get('name')
if old_name is not None and old_name != form.name.data:
flash('看来你改变了名字')
session['name']=form.name.data
return redirect(url_for('index1'))
return render_template('index.html', name=session.get('name'), form=form, current_time=datetime.utcnow())if __name__ == '__main__':
app.run(debug=True)

app

{% for message in get_flashed_messages() %}
<div class="alert alert-warning">
<button type="button" class="close" data-dismiss="alert">&times;</button>
{{ message }}
</div>
{% endfor %}

base.html增加

{{ wtf.quick_form(form) }}

index

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,954
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,479
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,291
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,108
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,740
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,774