cookie和session
cookie
Flask中set_cookie()方法可以用来设置Cookie。它接收三个参数:key,value和选项。
key:要设置的Cookie的名称。
value:要设置的Cookie的值。
选项:是一个可选的字典,用来设置Cookie的选项,例如过期时间、域、路径、是否应该启用安全性等。可以使用以下选项:
max_age
:指定Cookie的最大年龄(以秒为单位)。expires
:指定Cookie的到期时间,它通常更容易使用max_age
替代。domain
:指定Cookie的域名,默认值为访问该Cookie的网站的域名。path
:指定Cookie的路径,默认值为解析请求URL时得到的路径。secure
:指定Cookie是否仅通过HTTPS发送,默认值为False。httponly
:如果设置为True,则它将与客户端脚本保持不变,且仅能通过HTTP协议发送给服务器。这有助于防止某些类型的攻击,如XSS攻击。samesite
:指定如何处理Cookie同站点外的访问,它可以是"strict"
、"lax"
或None。如果值是"strict"
,则该Cookie仅在请求URL与其来源完全匹配时发送,不包括子域名。如果值是"lax"
,则该Cookie在请求URL与其来源具有相同的顶级域名时发送。如果值是None,则忽略此选项。
cookie.py
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/')
def index():
# 从客户端获取Cookie
username = request.cookies.get('username')
if username:
return f"Hello, {username}! Your username is stored in a cookie."
else:
return "Hello, new visitor! You don't have a username stored in a cookie."
@app.route('/set-cookie/<username>')
def set_cookie(username):
# 设置Cookie到响应中
resp = make_response(f"Your username is set to {username}.")
resp.set_cookie('username', username)
return resp
@app.route('/del-cookie')
def del_cookie():
# 清除Cookie
resp = make_response("Your username cookie is deleted.")
resp.delete_cookie('username')
return resp
if __name__ == '__main__':
app.run()
访问http://127.0.0.1:5000
访问http://127.0.0.1:5000/set-cookie/quanquan
访问http://127.0.0.1:5000
访问http://127.0.0.1:5000/del-cookie
session
session.py
from flask import Flask, session, redirect, url_for
app = Flask(__name__)
app.secret_key = 'your_secret_key'
@app.route('/')
def index():
# 检查是否已经登录
if 'username' in session:
return f'欢迎您,{session["username"]}!'
# 如果未登录就重定向到登录页面
return redirect(url_for('login'))
@app.route('/login')
def login():
# 登录操作,这里简单起见直接设置用户名为 testuser
session['username'] = 'testuser'
return '登录成功!'
@app.route('/logout')
def logout():
# 注销操作,删除掉 session 中的用户名信息
session.pop('username', None)
return '已注销!'
if __name__ == '__main__':
app.run()
设置 secret_key
。secret_key
是必需的,用于保护用户会话数据的安全性。
在 /
路径中,检查当前用户的会话中是否存在用户名信息。如果存在,显示欢迎信息;否则重定向到登录页面。
在 /login
路径中,将用户名 “testuser” 存储到会话中。
在 /logout
路径中,从会话中删除用户名信息,以注销当前用户。
注意:Flask 默认使用客户端 Cookie 来存储 session 数据,因此在使用 session
之前必须设置 secret_key
。另外,可以将 session 存储到服务器端的数据库或其他存储中,以提高安全性和可扩展性。
文件上传
file_upload.py
需要先在py文件目录下创建upload文件夹,否则会报错
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/')
def upload_file_form():
return render_template('upload.html')
@app.route('/upload', methods=['POST'])
def upload_file():
file = request.files['file']
if file:
# 保存文件到指定路径
file.save('uploads/' + file.filename)
return '文件上传成功!'
else:
return '没有选择文件!'
if __name__ == '__main__':
app.run()
upload_file()
函数用于处理文件上传的 POST 请求。在这个函数中,我们首先通过 request.files['file']
获取上传的文件对象,然后使用 save()
方法将文件保存到指定路径(这里将文件保存到名为 “uploads” 的文件夹下)。最后返回一个上传成功的提示信息。
upload.html(必须放在templates文件夹下)
<!doctype html>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<h1>文件上传</h1>
<form method="POST" action="/upload" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
</body>
</html>
MySql数据库
简介
MySQL是一个开源的关系型数据库管理系统(RDBMS),它是使用C和C++编写的。MySQL是最受欢迎的开源数据库之一,并且在Web开发中广泛应用。
以下是MySQL的一些关键特点和优势:
- 开源免费:MySQL是开源软件,可以免费使用,而且有庞大的开源社区支持,不仅更新迭代速度快,还有大量的文档、学习资源和插件可供使用。
- 可靠性和稳定性:MySQL是一个成熟而可靠的数据库管理系统,被广泛地用于各种规模的企业应用。它经过了长时间的发展和测试,具有良好的稳定性和可靠性。
- 跨平台支持:MySQL可以在多个操作系统上运行,包括Windows、Linux、macOS等,因此可以轻松地部署和迁移数据库到不同的环境中。
- 高性能:MySQL针对高并发的读写操作进行了优化,具备出色的性能表现。它支持多种存储引擎,如InnoDB、MyISAM等,用于适应不同的应用场景和性能需求。
- 可扩展性:MySQL具有良好的可扩展性,可以处理大规模数据集和高负载的应用。它支持主从复制、分区、集群等特性,以提供更好的性能和可靠性。
- 丰富的功能:MySQL提供了广泛的功能和特性,包括事务支持、索引、外键约束、存储过程、触发器等。这些功能使开发人员可以更灵活地管理和操作数据。
- 广泛的应用领域:由于MySQL易于使用和部署,并且具有良好的性能和可靠性,它被广泛应用于各种领域,包括Web应用程序、电子商务、大数据分析、日志记录等。
python操作mysql驱动
mysql-connector-python
:- 官方驱动程序:
mysql-connector-python
是MySQL官方推荐的Python驱动程序,由MySQL开发团队维护和支持。 - 安装方式:可以通过
pip install mysql-connector-python
命令进行安装。 - 使用方式:连接MySQL数据库时,使用
mysql.connector.connect()
方法建立连接,执行SQL语句使用游标对象的execute()
方法。 - 特点:支持高级功能,如连接池、批量插入等。提供了更全面的API文档和示例。
- 官方驱动程序:
pymysql
:- 纯Python实现的驱动程序:
pymysql
是一个纯Python实现的MySQL驱动程序,可以在Python中直接使用,不需要额外的依赖。 - 安装方式:可以通过
pip install pymysql
命令进行安装。 - 使用方式:连接MySQL数据库时,使用
pymysql.connect()
方法建立连接,执行SQL语句使用游标对象的execute()
方法。 - 特点:与原生的MySQLdb接口兼容,并且在一些情况下性能更好。相对来说,
pymysql
功能较为简单,但易于使用和学习。
- 纯Python实现的驱动程序:
mysql-connector-python
执行效率比pymysql
低,学习使用pymysql
安装pymysql:
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
Flask-SQLAlchemy
Flask-SQLAlchemy是一个与Flask框架集成的SQLAlchemy扩展库,提供了简化数据库操作的功能。SQLAlchemy是一个功能强大的Python SQL工具包,可以实现对多种关系型数据库的访问和操作,而Flask-SQLAlchemy则在此基础上提供了更便捷的数据库集成。
Flask-SQLAlchemy的主要特点和功能如下:
- 数据库模型定义:使用Flask-SQLAlchemy,可以通过定义Python类来表示数据库表结构。这些类称为模型(Models),每个模型类对应一个数据库表。模型类可以继承自Flask-SQLAlchemy提供的
db.Model
基类,并使用类属性来定义字段、关系等信息。 - 数据库迁移支持:Flask-SQLAlchemy集成了Flask-Migrate扩展,可以方便地进行数据库迁移操作。数据库迁移用于管理数据库结构的变化,例如创建表、添加字段、修改字段类型等。Flask-Migrate可以自动检测模型类的变化,并生成相应的迁移脚本供执行。
- 数据库操作封装:Flask-SQLAlchemy封装了SQLAlchemy的数据库操作接口,提供了一系列便捷的方法来执行常见的数据库操作,如插入数据、查询数据、更新数据、删除数据等。使用Flask-SQLAlchemy,可以避免编写繁琐的SQL语句,简化了数据库操作的代码编写。
- 数据库会话管理:Flask-SQLAlchemy提供了会话(Session)管理功能,可以自动处理数据库连接的获取和释放,保证数据库操作的一致性和安全性。可以使用
db.session
来获取当前请求上下文中的会话对象,并通过该对象执行数据库操作。 - ORM支持:SQLAlchemy本身就是一个对象关系映射(Object Relational Mapping)工具包,它可以将数据库表结构映射为Python对象,从而可以以面向对象的方式进行数据库操作。Flask-SQLAlchemy作为SQLAlchemy在Flask中的扩展,提供了更方便的ORM操作的接口,使得开发者可以更容易地操作数据库。
安装flask_sqlalchemy:
pip install flask_sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
flask连接数据库
使用Navicat新建数据库
运行connect.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text
app = Flask(__name__)
# MySQL所在的主机名
HOSTNAME = "127.0.0.1"
# MySQL监听的端口号,默认3306
PORT = 3306
# 连接MySQL的用户名
USERNAME = "root"
# 连接MySQL的密码
PASSWORD = "root"
# MySQL上创建的数据库名称
DATABASE = "database_learn"
# SQLALCHEMY_DATABASE_URI 是 SQLAlchemy 中用于指定数据库连接地址的参数
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
db = SQLAlchemy(app)
with app.app_context(): # app.app_context() 创建了一个应用上下文,确保在上下文中执行后续的数据库操作。
with db.engine.connect() as conn: # db.engine.connect() 使用 SQLAlchemy 的引擎对象创建一个数据库连接。
rs = conn.execute(text("select 1")) # text 函数用于将字符串转换为 SQLAlchemy 可以理解的查询对象
print(rs.fetchone()) # rs.fetchone() 获取了查询结果的第一行数据(1,)
if __name__ == '__main__':
app.run()
打印(1,)则连接数据库成功
ORM模型
在Python中,SQLAlchemy 是一个常用的 ORM 框架,它提供了一组强大的工具和API,用于简化数据库操作。使用 SQLAlchemy,开发者可以定义数据库表结构对应的 Python 类,通过操作这些类的实例来完成对数据库的增删改查操作。
orm_create.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 创建 Flask 应用对象
app = Flask(__name__)
# 配置数据库连接信息
HOSTNAME = "127.0.0.1"
PORT = 3306
USERNAME = "root"
PASSWORD = "root"
DATABASE = "database_learn"
app.config[
'SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
# 初始化 SQLAlchemy 对象
db = SQLAlchemy(app)
# 定义 ORM 模型类 User
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
# 在应用上下文中创建数据库表
with app.app_context():
db.create_all()
# 启动 Flask 应用
if __name__ == '__main__':
app.run()
运行orm_create.py后,通过Navicat中查看到数据库中的表
Flask-SQLAlchemy字段类型
字段类型 | 描述 |
---|---|
String(length) | 字符串类型,可指定最大长度。 |
Text | 文本类型,适合存储较长的文本数据。 |
Integer | 整数类型。 |
Float | 浮点数类型。 |
Boolean | 布尔类型,表示真(True)或假(False)。 |
DateTime | 日期和时间类型。 |
Date | 日期类型。 |
Time | 时间类型。 |
JSON | JSON 数据类型,用于存储 JSON 格式数据。 |
Enum(*values) | 枚举类型,从给定的值中选择一个。 |
db.Column常用参数
参数名 | 类型 | 描述 |
---|---|---|
type | 类型 | 字段类型,例如 String(length) 、Integer 等。 |
primary_key | 布尔型 | 是否为主键。 |
nullable | 布尔型 | 是否可以为空。 |
default | 任意类型 | 默认值。 |
index | 布尔型 | 是否为索引。 |
unique | 布尔型 | 是否唯一。 |
autoincrement | 布尔型 | 是否自增。 |
CRUD操作
ORM进行CRUD(create、read、update、delete)操作,需要先把操作添加到会话中,通过db.session可以获取到会话对象。会话对象存在内存中,如果要把会话中的操作提取到数据库中,需要调用db.session.commit()操作;如果要把会话中的操作回滚,则需要调用db.session.rollback()实现
crud_db.py
from flask import Flask, render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:root@127.0.0.1:3306/database_learn?charset=utf8mb4"
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), nullable=False)
password = db.Column(db.String(100), nullable=False)
# 在应用上下文中创建数据库表
with app.app_context():
db.create_all()
@app.route('/')
def index():
users = User.query.all() # read操作
return render_template('crud_db.html', users=users)
@app.route('/add', methods=['POST'])
def add_user(): # create操作
username = request.form['username']
password = request.form['password']
user = User(username=username, password=password)
db.session.add(user)
# 提交当前事务并将所有挂起的更改保存到数据库中
db.session.commit()
return redirect('/')
@app.route('/delete/<int:user_id>')
def delete_user(user_id): # delete操作
user = User.query.get_or_404(user_id)
db.session.delete(user)
db.session.commit()
return redirect('/')
@app.route('/update/<int:user_id>', methods=['POST'])
def update_user(user_id): # update操作
user = User.query.get_or_404(user_id)
user.username = request.form['username']
user.password = request.form['password']
db.session.commit()
return redirect('/')
if __name__ == '__main__':
app.run(debug=True)
crud.html(放在templates文件夹下)
<!DOCTYPE html>
<html>
<head>
<title>User Management</title>
</head>
<body>
<h2>用户列表</h2>
<ul>
{% for user in users %}
<li>用户名:{{ user.username }} 密码:{{ user.password }} <a href="/delete/{{ user.id }}">删除</a>
<form action="/update/{{ user.id }}" method="post">
<input type="text" name="username" placeholder="新的用户名">
<input type="text" name="password" placeholder="新的密码">
<input type="submit" value="更新"></form>
</li>
{% endfor %}
</ul>
<h2>添加用户</h2>
<form action="/add" method="post">
<input type="text" name="username" placeholder="用户名" required>
<input type="text" name="password" placeholder="密码" required>
<input type="submit" value="添加">
</form>
</body>
</html>
运行:
从数据库提取数据常用方法
方法 | 描述 |
---|---|
Model.query.all() | 获取表中所有记录 |
Model.query.first() | 获取第一条记录 |
Model.query.count() | 获取查询结果集数 |
Model.query.get(primary_key) | 根据主键获取单条记录 |
Model.query.filter_by(**kwargs).all() | 根据指定条件过滤并获取多条记录 |
Model.query.filter_by(**kwargs).first() | 根据指定条件过滤并获取第一条记录 |
Model.query.filter_by(**kwargs).one() | 根据指定条件过滤并获取唯一一条记录 |
Model.query.filter(*criterion).all() | 使用复杂条件过滤并获取多条记录 |
Model.query.order_by(column).all() | 根据指定列进行排序并获取多条记录 |
Model.query.limit(num).all() | 限制获取的记录数 |
Model.query.paginate(page, per_page) | 对查询结果进行分页处理 |
Model.query.join(OtherModel).filter(...).all() | 使用 JOIN 连接其他模型并应用筛选条件获取多条记录 |
db.session.query(Model.column).distinct().all() | 获取某一列的去重值的列表 |
外键
crud_db.py
from flask import Flask, render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:root@127.0.0.1:3306/database_learn?charset=utf8mb4"
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), nullable=False)
password = db.Column(db.String(100), nullable=False)
class Book(db.Model):
__tablename__ = "book"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
# 外键
user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
# db.relationship是在Flask中使用的一种关系映射技术,它建立了两个数据模型对象之间的关系。
# 通常用于实现ORM(对象关系映射)的一部分,可用于描述模型之间的一对多、多对多等关系
author = db.relationship("User")
# 在应用上下文中创建数据库表
with app.app_context():
db.create_all()
@app.route('/')
def index():
users = User.query.all()
return render_template('user.html', users=users)
@app.route('/add', methods=['POST'])
def add_user():
username = request.form['username']
password = request.form['password']
user = User(username=username, password=password)
db.session.add(user)
db.session.commit()
return redirect('/')
@app.route('/delete/<int:user_id>')
def delete_user(user_id):
user = User.query.get_or_404(user_id)
db.session.delete(user)
db.session.commit()
return redirect('/')
@app.route('/update/<int:user_id>', methods=['POST'])
def update_user(user_id):
user = User.query.get_or_404(user_id)
user.username = request.form['username']
user.password = request.form['password']
db.session.commit()
return redirect('/')
@app.route('/book/<int:user_id>')
def index_book(user_id):
books = Book.query.filter(Book.user_id == user_id).all()
return render_template('book.html', books=books)
@app.route('/delete_book/<int:book_id>')
def delete_book(book_id):
book = Book.query.get_or_404(book_id)
db.session.delete(book)
db.session.commit()
return redirect('/')
@app.route('/update_book/<int:book_id>', methods=['POST'])
def update_book(book_id):
book = Book.query.get_or_404(book_id)
book.name = request.form['name']
db.session.commit()
return redirect('/')
if __name__ == '__main__':
app.run(debug=True)
book.html
<!DOCTYPE html>
<html>
<head>
<title>Book Management</title>
</head>
<body>
<h2>书籍列表</h2>
<ul>
{% for book in books %}
<li>书名:{{ book.name }}<a href="/delete_book/{{ book.id }}">删除</a>
<form action="/update_book/{{ book.id }}" method="post">
<input type="text" name="name" placeholder="新的书名">
<input type="submit" value="更新"></form>
</li>
{% endfor %}
</ul>
</body>
</html>
user.html
<!DOCTYPE html>
<html>
<head>
<title>User Management</title>
</head>
<body>
<h2>用户列表</h2>
<ul>
{% for user in users %}
<li>用户名:{{ user.username }} 密码:{{ user.password }}
<a href="/delete/{{ user.id }}">删除</a>
<a href="/book/{{ user.id }}">书籍管理</a>
<form action="/update/{{ user.id }}" method="post">
<input type="text" name="username" placeholder="新的用户名">
<input type="text" name="password" placeholder="新的密码">
<input type="submit" value="更新"></form>
</li>
{% endfor %}
</ul>
<h2>添加用户</h2>
<form action="/add" method="post">
<input type="text" name="username" placeholder="用户名" required>
<input type="text" name="password" placeholder="密码" required>
<input type="submit" value="添加">
</form>
</body>
</html>
Flask-Migrate
Flask-Migrate 是一个用于数据库迁移的 Flask 扩展,它基于 Alembic 实现了数据库模式版本管理。使用 Flask-Migrate 可以方便地管理数据库模式的变更和迁移。
在 Flask 项目中使用 Flask-Migrate,通过以下命令使用 pip 安装 Flask-Migrate:
pip install Flask-Migrate -i https://pypi.tuna.tsinghua.edu.cn/simple
安装完成后,需要对 Flask 应用进行配置。在 Flask 应用的工厂函数中,需要初始化 Flask-Migrate 并绑定到应用上,例如:
from flask import Flask
from flask_migrate import Migrate
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = '数据库连接URI'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 初始化 Flask-Migrate
migrate = Migrate(app, db)
上述代码中,SQLALCHEMY_DATABASE_URI
需要设置成实际的数据库连接 URI,SQLALCHEMY_TRACK_MODIFICATIONS
则用于禁止 Flask-Migrate 自动跟踪对象模型的修改。
初始化完成后,就可以使用 Flask-Migrate 的命令来执行数据库迁移操作了。常用的命令有:
flask db init
:初始化迁移环境,只需要运行一次。flask db migrate
:生成一个迁移脚本,用于将数据库模式更新到最新版本。flask db upgrade
:将数据库迁移到最新版本。
需要注意的是,在使用 Flask-Migrate 进行数据库迁移之前,需要先定义好数据库模型,并在每次修改了模型之后重新生成迁移脚本。
Flask-Mail
官方网页
https://pythonhosted.org/Flask-Mail/
简介
Flask-Mail 是 Flask 框架的一个扩展,用于在 Web 应用程序中发送电子邮件。它提供了一套简单而强大的工具,使得邮件的发送和管理变得更加容易。
以下是 Flask-Mail 的主要特性:
- 邮件发送:Flask-Mail 提供了发送电子邮件的接口。你可以轻松设置收件人、发件人、主题、正文等邮件属性,并可以支持发送 HTML 格式的邮件。还可以添加附件,如图片、文件等。发送邮件只需几行代码即可完成。
- 邮件模板:你可以将 Flask 的模板引擎与 Flask-Mail 配合使用,创建具有动态内容的邮件模板。可以使用模板语法和表达式来渲染邮件内容,例如插入变量、条件语句和循环等。这样可以更灵活地生成邮件内容。
- 异步发送:Flask-Mail 支持异步发送邮件,特别适用于发送大量邮件或邮件发送时间较长的情况。通过将邮件发送任务放入后台队列或异步任务中,可以避免阻塞用户请求,提高应用程序的性能和响应速度。
- 配置管理:Flask-Mail 允许你轻松配置邮件服务器和其他相关设置。你可以指定 SMTP 服务器地址、端口号、用户名、密码等,以及是否使用 TLS/SSL 安全连接。可以根据不同的环境配置文件进行配置,方便地适应不同的部署环境。
- 错误处理:Flask-Mail 提供了异常处理机制,可以捕获邮件发送过程中的错误,并采取相应的处理措施。这样可以保证邮件发送的稳定性和可靠性。你可以根据具体需求,选择如何处理邮件发送错误,例如记录日志、发送通知等。
Flask-Mail 是一个强大而易用的邮件扩展,广泛应用于各种 Flask Web 应用程序中,如用户注册验证、密码重置、通知和提醒等场景。通过使用 Flask-Mail,你可以轻松地集成和处理电子邮件功能,为你的应用程序提供更好的用户体验。
安装Flask-Mail
pip install Flask-Mail -i https://pypi.tuna.tsinghua.edu.cn/simple
配置Flask-Mail
# 邮箱配置
MAIL_SERVER = "smtp.qq.com" #项目中用QQ邮箱
MAIL_PORT = 465
MAIL_USE_TLS = False
MAIL_USE_SSL = True
MAIL_DEBUG = True #发送邮件会提示日志信息
MAIL_USERNAME = "qq邮箱"
MAIL_PASSWORD = "授权码" #登录qq邮箱——>设置——>账号——>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务——>获取授权码
MAIL_DEFAULT_SENDER = "qq邮箱"
使用Flask-Mail
from flask import Flask
from flask_mail import Mail
app = Flask(__name__)
mail = Mail(app)
WTForms
WTForms是一个用于处理表单的Python库。它提供了简单且易于使用的方式来定义、验证和渲染表单。
使用WTForms,您可以通过创建一个表单类来定义表单字段,并在视图函数中使用该表单类来处理用户提交的数据。
下面是使用WTForms的一些常见步骤:
1.安装WTForms
可以使用pip命令来安装:
pip install WTForms -i https://pypi.tuna.tsinghua.edu.cn/simple
2.导入必要的模块
在您的程序文件中,导入所需的模块。通常,您需要导入wtforms
和flask_wtf
模块。
pythonCopy Codefrom wtforms import Form, StringField, SubmitField
from flask_wtf import FlaskForm
3.创建表单类
使用WTForms,您可以创建一个表单类来定义表单字段。在表单类中,您可以定义各种字段类型,例如字符串字段(StringField)、整数字段(IntegerField)、提交按钮字段(SubmitField)等。
pythonCopy Codeclass MyForm(FlaskForm):
name = StringField('Name')
email = StringField('Email')
submit = SubmitField('Submit')
4.表单验证和处理
在您的视图函数中,实例化表单类并使用request.form
传递用户提交的数据进行表单验证和处理。
pythonCopy Codefrom flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
form = MyForm()
if request.method == 'POST' and form.validate():
name = form.name.data
email = form.email.data
# 处理表单数据
return 'Form submitted successfully!'
return render_template('index.html', form=form)
if __name__ == '__main__':
app.run()
5.表单渲染
在模板文件(例如index.html)中,使用WTForms提供的模板渲染函数来渲染表单字段。
htmlCopy Code<form method="POST" action="/">
{{ form.csrf_token }}
{{ form.name.label }} {{ form.name() }}
{{ form.email.label }} {{ form.email() }}
{{ form.submit() }}
</form>
6.报错解决
Flask项目,使用WTForms表单模块的email验证器报错:raise Exception(“Install ‘email_validator’ for email validation support.”) Exception: Install ‘email_validator’ for email validation support.
原因:
WTForms2.3.0+以后的版本已经不支持email验证器了。
方法:
法1:重新安装低版本的wtforms
pip install wtforms==2.2.1
法2:重新安装对email支持的wtforms
pip install wtforms[email]
法3:再补装一个email-validator
pip install email-validator -i https://pypi.tuna.tsinghua.edu.cn/simple