表单处置惩罚
- 根本表单处置惩罚:使用 request.form 获取表单数据。
- 使用 Flask-WTF:团结 WTForms 举行表单处置惩罚和验证,简化表单使用。
- 表单验证:使用验证器确保表单数据的有用性。
- 文件上传:处置惩罚文件上传和生存文件。
- CSRF 掩护:确保表单免受跨站哀求伪造攻击。
根本表单处置惩罚
form.html
- <!DOCTYPE html>
- <html>
- <head>
- <title>Form Example</title>
- </head>
- <body>
- <form action="/submit" method="post">
- <label for="name">Name:</label>
- <input type="text" id="name" name="name">
- <br>
- <label for="email">Email:</label>
- <input type="email" id="email" name="email">
- <br>
- <input type="submit" value="Submit">
- </form>
- </body>
- </html>
复制代码 app.py
- @app.route('/form')
- def form():
- return render_template('form.html')
- @app.route('/submit', methods=['POST'])
- def submit():
- name = request.form.get('name')
- email = request.form.get('email')
- return f'Name: {name}, Email: {email}'
复制代码
request.form.get('变量名'),变量名是input中的name字段的值
使用 Flask-WTF 扩展
Flask-WTF 是一个封装了 WTForms 的扩展,提供了表单处置惩罚和验证的功能,使得表单处置惩罚更加简便和强盛。
安装 Flask-WTF
- pip install flask-wtf
- # 我的设备上有Python2.7和Python3,给Python3安装所以用以下的命令
- # pip3 install flask-wtf
复制代码
app.py
- from flask import Flask, render_template, redirect, url_for
- from flask_wtf import FlaskForm
- from wtforms import StringField, EmailField, SubmitField
- from wtforms.validators import DataRequired, Email
- app = Flask(__name__)
- app.secret_key = '6a31ad17a15b0d887049fcfd478aedeb8da2d40049f1413ca4add757379d4237'
- # Required for form protection
- class MyForm(FlaskForm):
- name = StringField('Name', validators=[DataRequired()])
- email = EmailField('Email', validators=[DataRequired(), Email()])
- submit = SubmitField('Submit')
- @app.route('/form', methods=['GET', 'POST'])
- def form():
- form = MyForm()
- if form.validate_on_submit(): # 如果校验通过则显示姓名与邮箱地址
- name = form.name.data
- email = form.email.data
- return f'Name: {name}, Email: {email}'
- return render_template('form.html', form=form) # 否则显示form.html页面
- if __name__ == '__main__':
- app.run(debug=True)
复制代码 天生 app.secret_key
generate_secrets.py
- import secrets
- print(secrets.token_hex())
- # 6a31ad17a15b0d887049fcfd478aedeb8da2d40049f1413ca4add757379d4237
- # 64位的token
复制代码 表单处置惩罚和验证的功能
- name = StringField('Name', validators=[DataRequired()])
- email = EmailField('Email', validators=[DataRequired(), Email()])
复制代码 要求name和email非空,且email要符及格式
验证name和email
不输入name
不输入email
输入错误的email
输入name和准确格式的email
- Exception: Install 'email_validator' for email validation support.
复制代码 报错比力显着是还缺少emial_validator模块,通过下令行举行安装
- pip3 install email_validator
复制代码 继续哀求,报错消散,但界面没有出现下面的效果
- return f'Name: {name}, Email: {email}'
复制代码
一开始以为是html中的name和email是小写,导致提交时找不到元素,然而照旧不对。
IDE里的解释
# Call validate only if the form is submitted. This is a shortcut for form.is_submitted() and form.validate().
以是加了打印看时哪个函数报错,效果是form.validate()校验过程有题目,搜索相干资料,看怎么排查这个题目
- 哀求方法错误 – POST哀求,不是这个题目
- 表单数据错误 – 加上print(form.errors) 打印具体具体的错误 => {‘csrf_token’: [‘The CSRF tokens do not match.’]}
…
是csrf_token未匹配的缘故因由,对比了别的几种写法,未发现有什么特别使用,此中提到清算欣赏器缓存的使用,我不停都是使用Trae IDE自带的欣赏器,抱着试一试的心态。用Chrome测试了下,是正常的!
我又问了Trae里的AI,看能不能告诉我怎么清算自带的欣赏器,然后它的答复,始终讲不到点上。
在Trae起的web服务和主机起的web服务,应该是有差异的。都用了5000端口,以是不能同时起,两者不能相互访问。每次验证都要在关闭web再启动,为了反面遇到希奇的题目可以用差异欣赏器去对比验证。
Trae和主机传差异的port参数可以办理这个题目
- import sys
- if __name__ == '__main__':
- port = sys.argv[1] if len(sys.argv) > 1 else 5001
- app.run(port=<port>,debug=True)
复制代码 Chrome欣赏器正常表现
表单验证
app.py
- class MyForm2(FlaskForm):
- name = StringField('Name', validators=[
- DataRequired(), Length(min=1, max=8)
- ])
- email = EmailField('Email', validators=[
- DataRequired(), Email()
- ])
- submit = SubmitField('Submit')
-
- @app.route('/form2', methods=['GET', 'POST'])
- def form2():
- form = MyForm2()
- if form.validate_on_submit():
- name = form.name.data
- email = form.email.data
- return redirect(url_for('form'))
- return render_template('form.html', form=form)
复制代码 设置了Length,name最长只能输入8个
文件上传
Flask 还支持处置惩罚文件上传。上传的文件可以通过 request.files 访问。
templates/upload.html
- <!DOCTYPE html>
- <html>
- <head>
- <title>Upload File</title>
- </head>
- <body>
- <form action="/upload" method="post" enctype="multipart/form-data">
- <label for="file">File:</label>
- <input type="file" id="file" name="file">
- <br>
- <input type="submit" value="Upload">
- </form>
- </body>
- </html>
复制代码 app.py
- @app.route('/upload_file', methods=['GET'])
- def upload_form():
- return render_template('upload.html')
- @app.route('/upload', methods=['POST'])
- def upload():
- file = request.files.get('file')
- if file:
- filename = file.filename
- file.save(f'uploads/{filename}')
- return f'File uploaded successfully: {filename}'
- return 'No file uploaded'
复制代码 访问/upload_file,选择文件并上传,上传乐成后在app.py同级目次uploads下
CSRF 掩护
Flask-WTF 自动为表单提供 CSRF 掩护。你必要设置一个密钥来启用 CSRF 掩护,并在模板中包罗潜伏的 CSRF 令牌。
设置CSRF掩护
app.py
- app.secret_key = '6a31ad17a15b0d887049fcfd478aedeb8da2d40049f1413ca4add757379d4237'
复制代码 在模板中添加 CSRF 令牌
- <form method="post">
- {{ form.hidden_tag() }}
- <!-- Form fields here -->
- </form>
复制代码 Demo
Flask
参考
- Flask表单处置惩罚
- Form Validation with WTForms
- Flask WTF form.validate_on_submit()方法不起作用
- flask总结05(在 Flask 项目中办理 CSRF 攻击)
- Flask-WTF 表单令牌不匹配:The CSRF Tokens do not match
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|