Flask之WTF和SQLAlchemy(4)

1 Flask WTF

Web应用程序的一个重要方面是为用户提供用户界面。HTML提供了一个标签,用于设计界面。可以适当地使用Form(表单)元素,例如文本输入,单选按钮,选择等。
用户输入的数据以Http请求消息的形式通过GET或POST方法提交给服务器端脚本。

  • 服务器端脚本必须从http请求数据重新创建表单元素。因此,实际上,表单元素必须定义两次 一次在HTML中,另一次在服务器端脚本中。
  • 使用HTML表单的另一个缺点是很难(如果不是不可能的话)动态呈现表单元素。HTML本身无法验证用户的输入。

在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,使用Flask-WTF表单扩展,可以帮助进行CSRF验证,帮助我们快速定义表单模板,而且可以帮助我们在视图中验证表的数据。使用Flask-WTF,我们可以在Python脚本中定义表单字段,并使用HTML模板进行渲染。还可以将验证应用于WTF字段。

三方包安装:

pip install flask-WTF

标准表单字段
WTforms包中包含各种表单字段的定义。下面列出了一些标准表单字段:

字段名 说明
StringField 文本字段,表示 HTML表单元素
TextAreaField 多行文本字段
PasswordField 密码文本字段
HiddenField 隐藏文本字段
DateField 文本字段,值为datetime.date格式
DateTimeField 文本字段,值为datetime.datetime格式
IntegerField 文本字段,值为整数
DecimalField 文本字段,值为decimal.Decimal
FloatField 文本字段,值为浮点数
BooleanField 复选框,值为True和False。表示 HTML表单元素
RadioField 一组单选框
SelectField 下拉列表
SelectMultipleField 下拉列表,可选择多个值
FileField 文本上传字段
SubmitField 表单提交按钮 ,表示表单元素
FormField 把表单作为字段嵌入另一个表单
FieldList 一组指定类型的字段

WTForms常用验证函数

验证函数 说明
DataRequired 确保字段中有数据
Email 检查字段中的文本是否遵循电子邮件ID约定
IPAddress 在输入字段中验证IP地址
EqualTo 比较两个字段的值,常用于比较两次密码输入
Length 验证输入的字符串长度
NumberRange 验证输入的值在数字范围内
URL 验证URL
AnyOf 验证输入值在可选列表中
NoneOf 验证输入值不在可选列表中

注意
使用Flask-WTF需要配置参数SECRET_KEY。
CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。 SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密令牌。

用法示例:

from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SubmitField, RadioField, IntegerField, SelectField
from wtforms import validators, ValidationError
from flask import Flask, render_template, request, flash

app = Flask(__name__)
app.secret_key = 'development key'

#定义表单模型
class ContactForm(FlaskForm):
   # label: 名字    validators:验证器/验证器
   name = StringField(label="名字", validators=[validators.DataRequired("输入名字")])
   gender = RadioField(label='性别', choices=[('M', 'Male'), ('F', 'Female')])
   address = TextAreaField(label="地址")
   email = StringField(label="邮箱", validators=[validators.DataRequired("输入邮件地址"),
                               validators.Email("输入邮件地址,必须满足格式**@**")])
   age = IntegerField(label="年龄")
   language = SelectField(label='语言', choices=[('cpp', 'C++'),
                                                (
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我不能提供完整的代码和文件结构。但是,以下是一个基本的文件结构和一些代码示例,供您参考: 文件结构: ``` - app.py - forms.py - templates/ - index.html - login.html - register.html - test.html - base.html - static/ - images/ - css/ - js/ - models.py ``` app.py: ```python from flask import Flask, render_template, redirect, url_for, flash from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, EqualTo from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SECRET_KEY'] = 'secret_key' app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), unique=True, nullable=False) password = db.Column(db.String(60), nullable=False) class RegisterForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()]) confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) submit = SubmitField('Register') class LoginForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()]) submit = SubmitField('Login') @app.route('/') def index(): return render_template('index.html') @app.route('/register', methods=['GET', 'POST']) def register(): form = RegisterForm() if form.validate_on_submit(): user = User(username=form.username.data, password=form.password.data) db.session.add(user) db.session.commit() flash('Account created successfully!', 'success') return redirect(url_for('login')) return render_template('register.html', form=form) @app.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): user = User.query.filter_by(username=form.username.data).first() if user and user.password == form.password.data: flash('Login successful!', 'success') return redirect(url_for('test')) else: flash('Login unsuccessful. Please check your username and password.', 'danger') return render_template('login.html', form=form) @app.route('/test') def test(): return render_template('test.html') ``` forms.py: ```python from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, EqualTo class RegisterForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()]) confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) submit = SubmitField('Register') class LoginForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()]) submit = SubmitField('Login') ``` index.html: ```html {% extends 'base.html' %} {% block content %} <h1>Welcome to Online Face Detection Test</h1> <p> <a href="{{ url_for('register') }}">Register</a> | <a href="{{ url_for('login') }}">Login</a> </p> {% endblock %} ``` register.html: ```html {% extends 'base.html' %} {% block content %} <h1>Register</h1> <form method="POST"> {{ form.csrf_token }} {{ form.username.label }} {{ form.username }} {{ form.password.label }} {{ form.password }} {{ form.confirm_password.label }} {{ form.confirm_password }} {{ form.submit }} </form> {% endblock %} ``` login.html: ```html {% extends 'base.html' %} {% block content %} <h1>Login</h1> <form method="POST"> {{ form.csrf_token }} {{ form.username.label }} {{ form.username }} {{ form.password.label }} {{ form.password }} {{ form.submit }} </form> {% endblock %} ``` test.html: ```html {% extends 'base.html' %} {% block content %} <h1>Test</h1> <form method="POST" enctype="multipart/form-data"> {{ form.csrf_token }} <input type="file" name="image"> <select name="detection"> <option value="face">Face Detection</option> <option value="object">Object Detection</option> </select> <input type="submit" value="Submit"> </form> {% endblock %} ``` base.html: ```html <!DOCTYPE html> <html> <head> <title>{% block title %}Online Face Detection Test{% endblock %}</title> <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}"> </head> <body> <div class="container"> {% with messages = get_flashed_messages() %} {% if messages %} {% for message in messages %} <div class="alert alert-{{ message[1] }}"> {{ message[0] }} </div> {% endfor %} {% endif %} {% endwith %} {% block content %}{% endblock %} </div> </body> </html> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值