Flask WTForms 表单插件的使用

在Web应用中,表单处理是一个基本而常见的任务。Python的WTForms库通过提供表单的结构、验证和渲染等功能,简化了表单的处理流程。与此同时,Flask的扩展Flask-WTF更进一步地整合了WTForms,为开发者提供了更便捷、灵活的表单处理方式。Flask-WTF是建立在WTForms之上的Flask扩展,旨在简化Web应用中表单处理的流程。它提供了与Flask框架的无缝集成,使得表单的创建、验证和渲染变得非常容易。通过Flask-WTF,开发者能够轻松地构建具有强大功能和良好用户体验的表单页面。

主要特点:

  1. 结合WTForms功能: Flask-WTF基于WTForms库,继承了WTForms的强大功能,包括表单字段、验证器等,为开发者提供了一套完备的表单处理工具。
  2. Flask集成: 与Flask框架无缝集成,通过简单的导入和初始化,即可在Flask应用中使用Flask-WTF提供的表单处理功能。
  3. CSRF保护: Flask-WTF内置了CSRF(Cross-Site Request Forgery)保护机制,帮助开发者防范Web应用中的CSRF攻击。
  4. 表单渲染: 提供了方便的表单渲染方法,使得表单的呈现过程更为简单,开发者可以轻松定制表单的外观。
  5. 文件上传支持: 支持文件上传功能,使得开发者能够方便地处理包含文件上传功能的表单。

通过Flask-WTF,开发者能够以更高效的方式处理Web应用中的表单,减少重复性工作,提升开发效率。

简单验证表单

前台定义渲染模板,后端对模板渲染,并根据validators验证器中的规则对输入内容进行匹配。

<form method="post">{{ form.csrf_token }}<!--可自定义增加颜色--><p>{{ form.username.label(style="color:red;") }} : {{form.username}}</p><p>{{ form.password.label }} : {{form.password}}</p><p>{{ form.repeat_password.label }} : {{form.repeat_password}}</p>{% for msg in form.repeat_password.errors %}<p>提示: {{msg}}</p>{% endfor %}{{form.submit}}
</form>

后台定义MyFlaskForm(FlaskForm)类用于对登录表单进行动态渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo,Length,Regexpapp = Flask(__name__)app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"# 定义表单模型类
class MyFlaskForm(FlaskForm):# DataRequired 验证不为空,Length 限制长度, Regexp限制不允许出现弱口令username = StringField(label=u"登录账号", validators=[DataRequired(), Length(min=6, max=18)])password = PasswordField(label=u"登录密码", validators=[DataRequired(), Length(min=6, max=18)])repeat_password = PasswordField(label=u"确认密码", validators=[DataRequired(),EqualTo("password", u"两次密码不一致")])submit = SubmitField(label=u"提交")@app.route("/", methods=["GET", "POST"])
def index():form = MyFlaskForm()if request.method == "POST":if form.validate_on_submit():username = form.username.datapassword = form.password.datarepeat_password = form.repeat_password.dataprint("用户名: {} --> 密码: {}".format(username,repeat_password))return render_template("index.html", form=form)return render_template("index.html", form=form)if __name__ == '__main__':app.run(debug=True)

运行后默认构造一个账号密码登录窗口的表单,用户可以填写表单并返回给后台信息,如下图所示;

表单附加参数

所谓附加参数就是指,渲染器返回页面是主动对某个组件增加一些CSS属性,这些属性起到装饰作用,通常会使用render_kw属性返回CSS。

{% for msg in get_flashed_messages() %}<p>闪现消息: {{ msg }}</p>
{% endfor %}<form method="POST" id="form-data">{{ form.csrf_token }}{{ form.username.label }} : {{ form.username }}{{ form.password.label }} : {{ form.password }}{{ form.submit.label }} {{ form.submit }}
</form>

后台定义MyFlaskForm(FlaskForm)类用于对登录表单进行动态渲染。

from flask import Flask, render_template, request,flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo,Length,Regexpapp = Flask(__name__)app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"# 定义表单模型类
class MyFlaskForm(FlaskForm):username = StringField(# 标签label="账号",# 验证器validators=[DataRequired('请输入用户名')],description="账号",# 增加附加参数render_kw={"class":"form-control","placeholder":"请输入用户名","required":'required'})password = PasswordField(label="密码",validators=[DataRequired('请输入登录密码')],description="密码",render_kw={"class": "form-control","placeholder": "请输入登录密码","required": 'required'})submit = SubmitField(label="登录",render_kw={"class": "btn",})@app.route("/", methods=["GET", "POST"])
def index():form = MyFlaskForm()if request.method == "POST":if form.validate_on_submit():username = form.username.datapassword = form.password.dataprint("用户名: {} 密码: {}".format(username, password))if username == "lyshark" and password == "123123":flash("密码正确")else:flash("密码错误")return render_template("index.html", form=form)if __name__ == '__main__':app.run(debug=True)

运行上述代码,当用户输入密码错误后会出现闪现消息,如下图所示;

地址验证表单

Flask框架中特殊表单的验证有很多,常用的表单验证也就以下这几种。

<form method="post">{{ form.csrf_token }}<p>{{ form.url.label }} : {{form.url}}</p><p>{{ form.address_v4.label }} : {{form.address_v4}}</p><p>{{ form.address_v6.label }} : {{form.address_v6}}</p><p>{{ form.mac.label }} : {{form.mac}}</p>{{form.submit}}
</form>

后台定义MyFlaskForm(FlaskForm)类用于对登录表单进行动态渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskFormfrom wtforms import (BooleanField, DecimalField, DateField, DateTimeField, FieldList,FloatField, FormField, IntegerField, RadioField, SelectField,SelectMultipleField, StringField,SubmitField,PasswordField)from wtforms.validators import (DataRequired, data_required, Email, email, EqualTo, equal_to,IPAddress, ip_address, InputRequired, input_required, Length,length, NumberRange, number_range, Optional, optional,Regexp, regexp, URL, url, AnyOf,any_of, NoneOf, none_of, MacAddress, mac_address, UUID)app = Flask(__name__)app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"# 定义表单模型类
class MyFlaskForm(FlaskForm):url = StringField(label=u"验证网址", validators=[DataRequired(), Length(min=6, max=30),URL()])address_v4 = StringField(label=u"验证IPv4", validators=[DataRequired(), Length(max=30), IPAddress()])address_v6 = StringField(label=u"验证IPv6", validators=[DataRequired(), Length(max=30), IPAddress(ipv6=True)])mac = StringField(label=u"验证MAC地址",validators=[DataRequired(), Length(max=60), MacAddress()])submit = SubmitField(label=u"提交")@app.route("/", methods=["GET", "POST"])
def index():form = MyFlaskForm()if request.method == "POST":if form.validate_on_submit():url = form.url.dataaddress_v4 = form.address_v4.dataaddress_v6 = form.address_v6.datamac = form.mac.dataprint("网址: {} 地址v4: {} 地址v6: {} MAC地址: {}".format(url,address_v4,address_v6,mac))return render_template("index.html", form=form)return render_template("index.html", form=form)if __name__ == '__main__':app.run(debug=True)

网络IP地址的验证也有相应的表单,如下表单分别可以实现对不同地址的验证;

特殊表单验证

WTF表单除去常规表单验证以外,还可以验证其他特殊表单,例如验证邮箱,浮点数,日期时间等。

<form method="post">{{ form.csrf_token }}<!--邮箱--><p>{{ form.email.label }} --> {{ form.email }}</p>{% for msg in form.email.errors %}<p>错误提示: {{msg}}</p>{% endfor %}<!--年龄--><p>{{ form.age.label }} --> {{ form.age }}</p>{% for msg in form.age.errors %}<p>错误提示: {{msg}}</p>{% endfor %}<!--小数--><p>{{ form.height.label }} --> {{ form.height }}</p>{% for msg in form.height.errors %}<p>错误提示: {{msg}}</p>{% endfor %}<!--浮点数--><p>{{ form.float_.label }} --> {{ form.float_ }}</p>{% for msg in form.float_.errors %}<p>错误提示: {{msg}}</p>{% endfor %}<!--段落--><p>{{ form.description.label }} --> {{ form.description }}</p>{% for msg in form.description.errors %}<p>错误提示: {{msg}}</p>{% endfor %}<!--日期--><p>{{ form.local_date.label }} --> {{ form.local_date }}</p>{% for msg in form.local_date.errors %}<p>错误提示: {{msg}}</p>{% endfor %}<!--时间--><p>{{ form.time_date.label }} --> {{ form.time_date }}</p>{% for msg in form.time_date.errors %}<p>错误提示: {{msg}}</p>{% endfor %}<!--日期时间--><p>{{ form.datetime_date.label }} --> {{ form.datetime_date }}</p>{% for msg in form.datetime_date.errors %}<p>错误提示: {{msg}}</p>{% endfor %}{{form.submit}}
</form>

后台定义MyFlaskForm(FlaskForm)类用于对登录表单进行动态渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms.validators import DataRequired,Regexp,DataRequired, Length, Email, EqualTo, NumberRange
from wtforms.fields import (StringField, PasswordField, DateField, BooleanField,DateTimeField,TimeField,SelectField, SelectMultipleField, TextAreaField,FloatField,HiddenField,RadioField, IntegerField, DecimalField, SubmitField,IntegerRangeField)app = Flask(__name__)app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"# 定义表单模型类
class MyFlaskForm(FlaskForm):# 安装 pip install email-validatoremail = StringField(label=u"邮箱地址", validators=[Email(message=u"邮箱格式错误"),Length(max=32)])# 整数类型输入,必须输入整型数值,范围在16到70之间age = IntegerField(label=u"年龄", validators=[NumberRange(min=16, max=70)])# 小数类型输入,必须输入数字数值,显示时保留两位小数height = DecimalField(label=u"小数输入", places=2)# 浮点数类型输入,必须输入浮点数值float_ = FloatField(label=u"浮点数输入")# Text Area类型 段落输入框description = TextAreaField(label=u"段落输入")# 日期类型输入,必须输入是 "年-月-日" 格式的日期local_date = DateField(label=u"日期", format='%Y-%m-%d')# 时间类型输入,必须输入是 "时:分:秒" 格式time_date = TimeField(label=u"时间", format='%H:%M')# 日期时间类型,必须输入是 "年-月-日 时:分:秒" 格式datetime_date = DateTimeField(label=u"日期时间", format='%Y-%m-%d %H:%M:%S')submit = SubmitField(label=u"提交")@app.route("/", methods=["GET", "POST"])
def index():form = MyFlaskForm()if request.method == "POST":if form.validate_on_submit():email = form.email.dataage = form.age.dataheight = form.height.datafloat_ = form.float_.datadescription = form.description.dataprint("邮箱: {} 年龄: {} 小数点: {} 浮点数: {} 段落输入: {}".format(email,age,height,float_,description))local_date = form.local_date.datatime_date = form.time_date.datadatetime_date = form.datetime_date.dataprint("日期: {} 时间: {} 日期时间: {}".format(local_date,time_date,datetime_date))return render_template("index.html", form=form)return render_template("index.html", form=form)if __name__ == '__main__':app.run(debug=True)

特殊表单的构建,这里的表单包括了如下图所示的字段可以使用;

复选多选表单

复选框多选框与下拉选择框三种表单的验证方式总结。

<form method="post">{{ form.csrf_token }}<!--单选框过滤器--><p>{{ form.gender.label }} {{ form.gender }}</p>{% for msg in form.gender.errors %}<p>错误提示: {{msg}}</p>{% endfor %}<!--下拉框过滤器--><p>{{ form.jobs.label }} {{ form.jobs }}</p>{% for msg in form.jobs.errors %}<p>错误提示: {{msg}}</p>{% endfor %}<!--多选框过滤器--><p>{{ form.hobby.label }} {{ form.hobby }}</p>{% for msg in form.hobby.errors %}<p>错误提示: {{msg}}</p>{% endfor %}<!--单选框过滤器--><p>{{ form.accept.label }} {{ form.accept }}</p>{% for msg in form.accept.errors %}<p>错误提示: {{msg}}</p>{% endfor %}<!--复选框过滤器--><p>{{ form.favor.label }} {{ form.favor }}</p>{% for msg in form.favor.errors %}<p>错误提示: {{msg}}</p>{% endfor %}{{form.submit}}
</form>

后台定义MyFlaskForm(FlaskForm)类用于对登录表单进行动态渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import Form,widgets,validators
from wtforms.fields import simple,core
from wtforms.validators import DataRequired,Regexp,DataRequired, Length, Email, EqualTo, NumberRange
from wtforms.fields import (StringField, PasswordField, DateField, BooleanField,DateTimeField,TimeField,SelectField, SelectMultipleField, TextAreaField,FloatField,HiddenField,RadioField, IntegerField, DecimalField, SubmitField,IntegerRangeField)from wtforms.fields import simple,coreapp = Flask(__name__)app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"# 定义表单模型类
class MyFlaskForm(FlaskForm):# RadioBox单选框,choices里的内容会在ul标签里,里面每个项是(值,显示名)对gender = RadioField(label=u"性别", choices=[('man', '男'), ('wo', '女')], validators=[DataRequired()])# Select下拉单选框,choices里的内容会在Option里,里面每个项是(值,显示名)对jobs = SelectField(label=u"工作", choices=[("teacher","老师"),("doctor","医生"),("engineer","工程师")])# Select多选框,choices里的内容会在Option里,里面每个项是(值,显示名)对hobby = SelectMultipleField(label=u"兴趣", choices=[('swim', '渗透'),('skate', '运维'),('hike', '科学')])# Checkbox单选框 加上default='checked' 即默认是选上的accept = BooleanField(label=u"单选框", default='checked', validators=[DataRequired()])# Select复选框, 多选框合并选择,复选框favor = SelectMultipleField(label="特长",choices=((1, 'Python'), (2, '渗透'), (3, "运维"), (4, "科学")),coerce=int, default=[1, 2, 4],option_widget=widgets.CheckboxInput(),widget=widgets.ListWidget(prefix_label=False))submit = SubmitField(label=u"提交")@app.route("/", methods=["GET", "POST"])
def index():form = MyFlaskForm()if request.method == "POST":if form.validate_on_submit():gender = form.gender.datajobs = form.jobs.datahobby = form.hobby.dataaccept = form.accept.datafavor = form.favor.dataprint("性别: {} 工作: {} 兴趣: {} 是否接受: {} 复选框: {}".format(gender,jobs,hobby,accept,favor))return render_template("index.html", form=form)return render_template("index.html", form=form)if __name__ == '__main__':app.run(debug=True)

选择菜单包括了单选与多选,如下图所示的表单均可以构建;

文件上传表单

文件上传Flask也提供了默认表单可以使用,如下提供的FileField即可完成上传工作。

<form method="POST" action="" enctype="multipart/form-data">{{ form.hidden_tag() }}{{ form.attach.label }} {{ form.attach }}<input type="submit" value="Submit">
</form>

后台定义MyFlaskForm(FlaskForm)类用于对登录表单进行动态渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from werkzeug.utils import secure_filename
from flask_wtf.file import FileField, FileAllowed, FileRequiredapp = Flask(__name__)app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"# 定义表单模型类
class MyFlaskForm(FlaskForm):attach = FileField(label="上传文件",validators=[FileRequired(),FileAllowed(["jpg","png"],"只可上传图片")])@app.route("/", methods=["GET", "POST"])
def index():form = MyFlaskForm()if request.method == "POST":if form.validate_on_submit():filename = secure_filename(form.attach.data.filename)form.attach.data.save('/' + filename)return 'Upload successfully!'return render_template("index.html", form=form)return render_template("index.html", form=form)if __name__ == '__main__':app.run(debug=True)

上传表单时需要注意,启动的进程必须具备管理员权限或者是读写权限,否则则会提示权限拒绝;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/172857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32单片机】简易计算器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用动态数码管模块、矩阵按键、蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管默认显示0&#xff0c;输入对应的操作数进行四则运…

Echarts 设备状态 甘特图

在做工厂智能化生产看板时&#xff0c;绝对会有设备状态看板&#xff0c;展示设备当天或者当前状态&#xff0c;设备状态数据一般是有mes 系统设备管理模块对设备信息进行采集&#xff0c;一般包括过站数据&#xff0c;设备当前状态&#xff0c;是否在线是否故障、检修、待生产…

【计算机网络笔记】多路访问控制(MAC)协议——轮转访问MAC协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

树状数组 / pbds解法 E2. Array Optimization by Deque

Problem - 1579E2 - Codeforces Array Optimization by Deque - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 树状数组解法 将 a i a_i ai​插入到队头&#xff0c;贡献为&#xff1a;原队列中所有比 a i a_i ai​小的数的数量将 a i a_i ai​插入到队尾&#xff0c;贡献为&a…

极客时间:使用本地小型语言模型运行网页浏览器应用程序。

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

二进制编辑器hexedit的安装及使用

Hexedit 同时以 ASCII 和十六进制显示文件 安装 终端输入hexedit回车&#xff0c;如果没安装&#xff0c;会提示让输入 sudo apt-get install hexedit 照着输入命令&#xff0c;安装。安装完成后&#xff0c;cd到一个有二进制文件的目录下&#xff0c;输入hexedit命令回车 再…

集线器-交换机-路由器

1.集线器(Hub) 集线器就是将网线集中到一起的机器&#xff0c;也就是多台主机和设备的连接器。集线器的主要功能是对接收到的信号进行同步整形放大&#xff0c;以扩大网络的传输距离&#xff0c;是中继器的一种形式&#xff0c;区别在于集线器能够提供多端口服务&#xff0c;也…

从0开始学习JavaScript--构建强大的JavaScript图片库

在现代Web开发中&#xff0c;图像是不可或缺的一部分&#xff0c;而构建一个强大的JavaScript图片库能够有效地管理、展示和操作图像&#xff0c;为用户提供更丰富的视觉体验。本文将深入探讨构建JavaScript图片库的实用技巧&#xff0c;并通过丰富的示例代码演示如何实现各种功…

透过对话聊天聊网络tcp三次握手四次挥手

序 说起来网络&#xff0c;就让我想起的就是一张图。我在网上可以为所欲为&#xff0c;反正你又不能顺着网线来打我。接下来我们来详细说一下网络到底是怎么连接的。 TCP三次打招呼 首先我会用男女生之间的聊天方式&#xff0c;来举一个例子。 从tcp三次握手来说&#xff0c;…

基于Loki + Promtail + Grafana 搭建 Nginx 日志监控

文章目录 引言第一部分&#xff1a;Loki 简介与安装1.1 Loki 简介1.2 Loki 安装1.2.1 下载 Loki1.2.2 安装 Loki 1.3 启动 Loki 第二部分&#xff1a;Promtail 简介与安装2.1 Promtail 简介2.2 Promtail 安装2.2.1 下载 Promtail2.2.2 安装 Promtail 2.3 启动 Promtail 第三部分…

231126 刷题日报

1. 高楼扔鸡蛋 O(N*logN) 2. 698. 划分为k个相等的子集 没做出来&#xff0c;和划分两个子集不同 3. 300. 最长递增子序列 LIS petencie sorting 没看懂&#xff0c;明天看吧 4. 518. 零钱兑换 II 完全背包问题&#xff1a;每个物品数量是无限的 注意&#xff1a;dp的定义…

使用不平衡数据集练习机器学习

一、介绍 在当今世界&#xff0c;机器学习和人工智能几乎被广泛应用于每个领域&#xff0c;以提高绩效和结果。但如果没有数据&#xff0c;它们还有用吗&#xff1f;答案是否定的。机器学习算法严重依赖我们提供给它们的数据。我们提供给算法的数据质量在很大程度上决定了机器学…

2023年第十六届山东省职业院校技能大赛中职组“网络安全”赛项竞赛正式试题

第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题 目录 一、竞赛时间 二、竞赛阶段 三、竞赛任务书内容 &#xff08;一&#xff09;拓扑图 &#xff08;二&#xff09;A模块基础设施设置/安全加固&#xff08;200分&#xff09; &#xff08;三&#xf…

Centos 7.9 Install Docker Insecure Registry

文章目录 1. 镜像存储规划2. 安装定制 docker3. 部署 registry4. 验证镜像仓库 1. 镜像存储规划 linux LVM /dev/sdb mount dir /data【linux LVM 磁盘挂载目录】 创建两个目录 一个 docker 数据存储目录 &#xff1a;/data/docker&#xff0c;默认一般为linux为 /var/lib/d…

boomYouth

周一&#xff1a; 1. action异步写法&#xff1a; <script setup> import sonCom1 from /components/sonCom1.vue import sonCom2 from /components/sonCom2.vue import {useCountStore} from /store/counter import {useChannelStore} from /store/channel const count…

1、nmap常用命令

文章目录 1. 主机存活探测2. 常见端口扫描、服务版本探测、服务器版本识别3. 全端口&#xff08;TCP/UDP&#xff09;扫描4. 最详细的端口扫描5. 三种TCP扫描方式&#xff08;1&#xff09;TCP connect 扫描&#xff08;2&#xff09;TCP SYN扫描&#xff08;3&#xff09;TCP …

PTA-7-55 判断指定字符串是否合法

题目&#xff1a; 输入一个字符串&#xff0c;判断指定字符串是否合法&#xff0c;要求字符串由7个字符组成&#xff0c;并且第一位必须是大写字母&#xff0c;2-4为必须是小写字母&#xff0c;后3为必须是数字字符&#xff0c;要求使用正则表达式来实现。 根据题目要求&#x…

防火墙命令行基础配置实验(H3C模拟器)

嘿&#xff0c;这里是目录&#xff01; ⭐ H3C模拟器资源链接1. 实验示意图2. 要求3. 当前配置3.1 PC配置3.2 FW配置&#xff08;防火墙&#xff09;[^7][^8]3.2.1 FW1配置3.2.2 FW2配置 3.3 R配置3.3.1 R1配置3.3.2 R2配置 3.4 SW配置3.4.1 SW1配置3.4.2 SW2配置3.4.3 SW3配置…

1.9 字符数组

1.9 字符数组 一、字符数组概述二、练习 一、字符数组概述 所谓字符数组&#xff0c;就是char类型的数组&#xff0c;比如 char a[]&#xff0c;是C语言中最常用的数组类型&#xff0c;先看一个程序 #include <stdio.h> #define MAXLINE 1000 //最大行长度限制 int get…

gradle构建项目速度优化及排查方式

文章目录 一、前言二、Android项目优化1、相关配置2、构建速度分析 三、Gradle项目通用优化1、分析构建耗时2、使用配置进行优化3、优化依赖解析a. 避免不必要和未使用的依赖项b. 优化存储库顺序 c. 最小化动态和快照版本d. 通过构建扫描查找动态和变化的版本e. 通过构建扫描可…