首页 > 其他分享 >Flask学习笔记(十三)-Flask_WTF实现表单

Flask学习笔记(十三)-Flask_WTF实现表单

时间:2022-10-16 23:33:49浏览次数:46  
标签:CSRF form Flask app 表单 WTF import

一、Web表单

Web 表单是 Web 应用程序的基本功能。

它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。

在Flask中,为了处理web表单,我们可以使用 Flask-WTF 扩展,它封装了 WTForms,并且它有验证表单数据的功能

WTForms支持的HTML标准字段

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

WTForms常用验证函数

验证函数说明
DataRequired 确保字段中有数据
EqualTo 比较两个字段的值,常用于比较两次密码输入
Length 验证输入的字符串长度
NumberRange 验证输入的值在数字范围内
URL 验证URL
AnyOf 验证输入值在可选列表中
NoneOf 验证输入值不在可选列表中

使用 Flask-WTF 需要配置参数 SECRET_KEY。

CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。 SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密令牌。

二、Flask-WTF处理表单

1、Flask-WTF安装

pip install flask-wtf(注:安装失败时用镜像安装)。

2、启用CSRF保护

Flask-WTF提供了对所有Form表单免受跨站请求伪造(Cross-Site Request Forgery,CSRF)攻击的技术支持。

在app.py同一文件夹下新增config.py配置文件,要启用CSRF保护,需要在config.py中定义两个变量:

import os
SECRET_KEY = os.urandom(24)
CSRF_ENABLED = True

其中,SECRET_KEY用来建立加密的令牌,用于验证Form表单提交,可以设置的复杂些防止被恶意破解。  

实例展示:

  forms.py登录示例:

#encoding: utf-8
from flask_wtf import FlaskForm
from wtforms import PasswordField,StringField
from wtforms.validators import DataRequired,Length
class BaseLogin(FlaskForm):
    #用户名
    name = StringField('name', validators=[DataRequired(message="用户名不能为空"), Length(6,16,message='长度位于6~16之间')], render_kw={'placeholder':'输入用户名'})
    #密码
    password = PasswordField('password', validators=[DataRequired(message="密码不能为空"), Length(6,16,message='长度位于6~16之间')], render_kw={'placeholder':'输入密码'})

引入FlaskForm基类和StringField、PasswordField模块,设置用户名和密码验证条件。

然后修改app.py文件:

# exts.py
from flask_sqlalchemy import SQLAlchemy
from flask import Flask,request,render_template,flash
from config import Configs
from forms import BaseLogin
from flask_wtf.csrf import CSRFProtect
db = SQLAlchemy()
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = Configs.SQLALCHEMY_DATABASE_URI
CSRFProtect(app)
import os
app.config['SECRET_KEY'] = os.urandom(24)
CSRF_ENABLED = True
app.config['WTF_CSRF_CHECK_DEFAULT']=False

@app.route('/', methods=['GET', 'POST'])
def index():
    form = BaseLogin()
    return render_template("login.html", form=form)

@app.route('/login/',methods=['GET','POST'])
def baselogin():
    form = BaseLogin()
    if form.validate_on_submit():
        return "登录成功,欢迎回来!"
    else:
        return render_template("login.html", form=form)

if __name__ == "__main__":
    app.run(debug=True)

form = BaseLogin()用于生成登录界面用户名和密码框,初次登录和输入错误都将是登录界面,if form.validate_on_submit()用于判断提交信息是否通过。

再新建一个login.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask_WTF</title>
<style type="text/css">
.div1 {
    height:180px;
    width:380px;
    border:1px solid #8A8989;
    margin:0 auto;
}
.input {
    display: block;
    width:350px;
    height:40px;
    margin:10px auto;
}
.button {
    background: #2066C5;
    color:white;
    font-size:18px;
    font-weight: bold;
    height: 50px;
    border-radius: 4px;
}
</style>
</head>
<body>
 <div class="div1">
     <form action="login" method="post">
         {{form.csrf_token}}
         {{form.name( id="name", class="input")}}
         {{form.password( id="password", class="input")}}
         <input type="submit" value="登录" class="input button">
     </form>
</div>
</body>
</html>

CSRF需要在目标HTML模板中添加{{form.csrf_token}}或{{form.hidden_tag()}}才能响应,form是form.py种对应处理函数传递过来的FlaskForm对象名称。  

运行app.py文件,用户名和密码均输入admin:

 不能通过验证,要求用户名和密码均为6~16位,将用户名改为admin1密码改为123456:

运行结果如下:

 

  

  

标签:CSRF,form,Flask,app,表单,WTF,import
From: https://www.cnblogs.com/xfbk/p/16797590.html

相关文章

  • flask搭建平台入门教程三:增删改查接口及权限校验(前后端分离)
    用户注册登录实现后,下一步编写查询用户列表接口,使用flask_restful的marshal方法来生成字段数据,加上之前编写的login_requiredfromflaskimportBlueprint,jsonifyfrom......
  • flask搭建平台入门教程二:用户注册和登录
    这一篇主要实现用户注册和登录编写接口并设置URL根目录添加api文件夹,添加auth.py注册auth蓝图为根路径fromflaskimportBlueprint,jsonifyauthbp=Blueprint('au......
  • flask搭建平台入门教程一:配置数据库
    flask是什么?flask可以做什么这里就不说了,百度一下即可,这篇文章主要是手把手带你使用flask搭建一个简单的注册、登陆、以及用户权限管理模块。首先需要创建一个FLASK项......
  • flask-信号
    flask信号Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为。#pip3installblinker1.内置信号request_started=_signals......
  • Flask 学习-91.使用 gunicorn 部署 flask
    前言flask启动访问平常开发的时候可以用命令行flaskrun运行,正式部署到线上环境不会这样用。Gunicorn环境准备Web框架致力于如何生成HTML代码,而Web服务器用于处理和响......
  • 用flask搭建管理平台
    flask是什么?flask可以做什么这里就不说了,百度一下即可,这篇文章主要是手把手带你使用flask搭建一个简单的注册、登陆、以及用户权限管理模块。在pycharm上创建新的flask......
  • Python Flask-SocketIO没有启动成功
    背景最近想做websocket服务端,发现Flask已提供第三方库;尝试使用后,发现前端也必须使用SocketIO,不太适用,所以放弃。 问题WARNINGininit:WebSockettransportnotavai......
  • Python Flask 返回html文件
    1、在templates文件夹建立一个html文件<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>Index</title></head><body><h2>This is i......
  • Python Flask报错:TypeError: 'NoneType' object is not subscriptable
    问题:用Flask写了一个请求,用Jmeter请求时报错;但在postman中参数发送,可以成功返回数据以及正常状态码200; 分析:request以json形式发送post请求时,需要headers 解决:he......
  • Python 第一个Flask
    安装flaskpip3installflask 导入类fromflaskimportFlask 第一个Flask实例化创建一个Flask应用,第一个参数是Flask应用的名称app=Flask(__name_......