【python】网页开发——Flask进阶(一)cookie、session、文件上传、MySql数据库

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_keysecret_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的一些关键特点和优势:

  1. 开源免费:MySQL是开源软件,可以免费使用,而且有庞大的开源社区支持,不仅更新迭代速度快,还有大量的文档、学习资源和插件可供使用。
  2. 可靠性和稳定性:MySQL是一个成熟而可靠的数据库管理系统,被广泛地用于各种规模的企业应用。它经过了长时间的发展和测试,具有良好的稳定性和可靠性。
  3. 跨平台支持:MySQL可以在多个操作系统上运行,包括Windows、Linux、macOS等,因此可以轻松地部署和迁移数据库到不同的环境中。
  4. 高性能:MySQL针对高并发的读写操作进行了优化,具备出色的性能表现。它支持多种存储引擎,如InnoDB、MyISAM等,用于适应不同的应用场景和性能需求。
  5. 可扩展性:MySQL具有良好的可扩展性,可以处理大规模数据集和高负载的应用。它支持主从复制、分区、集群等特性,以提供更好的性能和可靠性。
  6. 丰富的功能:MySQL提供了广泛的功能和特性,包括事务支持、索引、外键约束、存储过程、触发器等。这些功能使开发人员可以更灵活地管理和操作数据。
  7. 广泛的应用领域:由于MySQL易于使用和部署,并且具有良好的性能和可靠性,它被广泛应用于各种领域,包括Web应用程序、电子商务、大数据分析、日志记录等。

python操作mysql驱动

  1. mysql-connector-python
    • 官方驱动程序:mysql-connector-python是MySQL官方推荐的Python驱动程序,由MySQL开发团队维护和支持。
    • 安装方式:可以通过pip install mysql-connector-python命令进行安装。
    • 使用方式:连接MySQL数据库时,使用mysql.connector.connect()方法建立连接,执行SQL语句使用游标对象的execute()方法。
    • 特点:支持高级功能,如连接池、批量插入等。提供了更全面的API文档和示例。
  2. pymysql
    • 纯Python实现的驱动程序:pymysql是一个纯Python实现的MySQL驱动程序,可以在Python中直接使用,不需要额外的依赖。
    • 安装方式:可以通过pip install pymysql命令进行安装。
    • 使用方式:连接MySQL数据库时,使用pymysql.connect()方法建立连接,执行SQL语句使用游标对象的execute()方法。
    • 特点:与原生的MySQLdb接口兼容,并且在一些情况下性能更好。相对来说,pymysql功能较为简单,但易于使用和学习。

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的主要特点和功能如下:

  1. 数据库模型定义:使用Flask-SQLAlchemy,可以通过定义Python类来表示数据库表结构。这些类称为模型(Models),每个模型类对应一个数据库表。模型类可以继承自Flask-SQLAlchemy提供的db.Model基类,并使用类属性来定义字段、关系等信息。
  2. 数据库迁移支持:Flask-SQLAlchemy集成了Flask-Migrate扩展,可以方便地进行数据库迁移操作。数据库迁移用于管理数据库结构的变化,例如创建表、添加字段、修改字段类型等。Flask-Migrate可以自动检测模型类的变化,并生成相应的迁移脚本供执行。
  3. 数据库操作封装:Flask-SQLAlchemy封装了SQLAlchemy的数据库操作接口,提供了一系列便捷的方法来执行常见的数据库操作,如插入数据、查询数据、更新数据、删除数据等。使用Flask-SQLAlchemy,可以避免编写繁琐的SQL语句,简化了数据库操作的代码编写。
  4. 数据库会话管理:Flask-SQLAlchemy提供了会话(Session)管理功能,可以自动处理数据库连接的获取和释放,保证数据库操作的一致性和安全性。可以使用db.session来获取当前请求上下文中的会话对象,并通过该对象执行数据库操作。
  5. 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时间类型。
JSONJSON 数据类型,用于存储 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 的主要特性:

  1. 邮件发送:Flask-Mail 提供了发送电子邮件的接口。你可以轻松设置收件人、发件人、主题、正文等邮件属性,并可以支持发送 HTML 格式的邮件。还可以添加附件,如图片、文件等。发送邮件只需几行代码即可完成。
  2. 邮件模板:你可以将 Flask 的模板引擎与 Flask-Mail 配合使用,创建具有动态内容的邮件模板。可以使用模板语法和表达式来渲染邮件内容,例如插入变量、条件语句和循环等。这样可以更灵活地生成邮件内容。
  3. 异步发送:Flask-Mail 支持异步发送邮件,特别适用于发送大量邮件或邮件发送时间较长的情况。通过将邮件发送任务放入后台队列或异步任务中,可以避免阻塞用户请求,提高应用程序的性能和响应速度。
  4. 配置管理:Flask-Mail 允许你轻松配置邮件服务器和其他相关设置。你可以指定 SMTP 服务器地址、端口号、用户名、密码等,以及是否使用 TLS/SSL 安全连接。可以根据不同的环境配置文件进行配置,方便地适应不同的部署环境。
  5. 错误处理: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.导入必要的模块

在您的程序文件中,导入所需的模块。通常,您需要导入wtformsflask_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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zz的学习笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值