虚拟环境安装
virtualenv
作用
virtualenv是一个虚拟的Python环境构建器。 它可以帮助用户并行创建多个Python环境。 因此,它可以避免不同版本的库之间的兼容性问题。
安装
1
2
3
4
5// pip 安装
pip install virtualenv
// linux安装
sudo apt-get install virtualenv创建虚拟环境
1
virtualenv venv
激活相应的环境
1
2
3
4
5// linux
venv/bin/activate
//windows
venv\scripts\activate
Flask-Swagger (生成API 文档)
Flask-Swagger 是一个用于集成 Swagger 和 Flask 的插件。它可以自动根据 Flask 应用程序中的路由信息生成 Swagger/OpenAPI 3.0 文档。
首先,我们需要安装 Flask-Swagger。可以使用 pip 命令来安装:
1 | pip install flask-swagger |
安装完成后,在 Flask 应用程序中导入 Flask-Swagger:
1 | from flask_swagger import Swagger |
接下来,创建一个 Flask 应用程序实例,并初始化 Swagger:
1 | app = Flask(__name__) |
现在,我们可以使用 @app.route
装饰器定义 API 路由,并添加 Swagger 注释。下面是一个简单的示例:
1 |
|
在该示例代码中,@app.route
装饰器用于定义路由和请求方法。@swagger
注释用于告诉 Flask-Swagger 该路由需要生成 Swagger 文档。通过浏览器访问 /apidocs
路径即可打开 Swagger UI
Flask
Flask 框架 轻量级,三方支持全
-Django 原生组件全
环境安装
1 | $ pip install Flask |
使用并创建应用
1 | from flask import Flask |
Flask构造函数将当前模块的名称(name)作为参数。
Flask类的route()函数是一个装饰器,它告诉应用程序哪个URL应该调用相关的函数。
1
2
3
4
5
6
7
8'''
rule 参数表示与该函数绑定的URL。
options 是要转发给底层Rule对象的参数列表。
'''
def fn():
passFlask类的run()方法在本地开发服务器上运行应用程序。
1
2
3
4
5from flask import Flask
app = Flask(__name__)
#方法中的所有参数都是可选的,作用如下表描述说明
if __name__ == '__main__':
app.run(host, port, debug, options)编号 参数 描述 1 host 监听的主机名。默认为127.0.0.1(localhost)。 设置为’0.0.0.0’使服务器在外部可用 2 port 监听端口号,默认为:5000 3 debug 默认为:false。 如果设置为:true,则提供调试信息 4 options 被转发到底层的Werkzeug服务器。
调试模式
flask 中的调试模式类似于前端的热更新,在开发过程中,修改代码,会自动重新启动server,重新加载最新代码,还可以提供一个有用的调试器来跟踪应用程序中的错误
在运行或将调试参数传递给run()方法之前,通过将应用程序对象的调试属性设置为True来启用调试模式。
1 | from flask import Flask |
Flask 路由
Flask中的route()装饰器用于将URL绑定到函数。 例如
1
2
3
4
5
6
7
8
9
10from flask import Flask
app = Flask(__name__)
def hello_world():
return 'hello world'
if __name__ == '__main__':
app.debug = True
app.run()此时浏览器应该访问 http://localhost:5000/hello
也可以使用
add_url_rule
函数来添加一个URL规则。例如1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16from flask import Flask
app = Flask(__name__)
def hello_world():
return 'hello world'
app.add_url_rule('/hello', 'hello', hello_world)
'''
1、'/hello':这是要添加的URL路径,表示用户在浏览器中访问的地址。
2、'hello':这是规则的命名,用于在代码中引用该规# 获取'/hello'路径的URL
with app.test_request_context():
print(url_for('hello')) # 输出:/hello则。 可以在后续代码中使用这个命名获取相应信息
3、hello_world:这是一个函数,它将在用户访问'/hello'路径时被调用,执行相应的操作。
'''
if __name__ == '__main__':
app.debug = True
app.run()
Flask变量规则 ( 路由传参)
可以通过将可变部分添加到规则参数来动态构建URL。 它作为关键字参数传递给规则所关联的函数。
1 | from flask import Flask |
除了默认的字符串变量部分之外,还可以使用以下转换器构造规则 -
编号 | 转换器 | 描述 |
---|---|---|
1 | int | 接受整数 |
2 | float | 对于浮点值 |
3 | path | 接受用作目录分隔符的斜杠符(/) |
重定向 - redirect()
1 |
|
url_for()
url_for()函数可以动态构建特定函数,该函数接受函数的名称作为第一个参数,并接受一个或多个关键字参数,每个参数对应于URL的变量部分。
1 | from flask import Flask, redirect, url_for |
Flask.abort (code)
Flask类具有带有错误代码的abort()函数。
1
2
3
4
5
6
7
8
9
10
11Flask.abort(code)
'''
code参数使用以下值之一 -
400 - 对于错误的请求
401 - 用于未经身份验证
403 - 禁止
404 - 未找到
406 - 不可接受
415 - 用于不支持的媒体类型
429 - 请求过多
'''
1 | from flask import Flask, redirect, url_for, render_template, request, abort |
Flask 特殊封装
send_file()
打开并返回文件内容,自动识别文件类型 Content-Type: text/plan
1 | from flask import Flask |
jsonify()
将字典变成标准的字符串 Content-Type: application/json
1 | from flask import Flask |
request 实例方法
request.method - 请求方式
request.args - 请求url 中的请求参数
1 | ?name='123'&id='123' |
request.from - FromData 数据 post请求提交
request.json - 请求头中带有 Content-Type:application/json
request.data - 请求头中不带有 From 或 FromData 会保存请求体中的原始信息
request.url - 请求路径
request.path - 请求方式
request.host - 请求 IP
request.host_url - 请求协议
request.files - 请求携带的文件信息
HTTP方法 - 请求允许,获取请求参数
编号 | 方法 | 描述 |
---|---|---|
1 | GET | 将数据以未加密的形式发送到服务器,这最常用的方法。 |
2 | HEAD | 与GET相同,但没有响应主体 |
3 | POST | 用于将HTML表单数据发送到服务器。通过POST方法接收的数据不会被服务器缓存。 |
4 | PUT | 用上传的内容替换目标资源的所有当前表示。 |
5 | DELETE | 删除由URL给出的所有目标资源的所有表示 |
默认情况下,Flask路由响应GET请求。 但是,可以通过为route()装饰器提供方法参数来更改此首选项。
1 | from flask import Flask, request, redirect, url_for |
Flask 模板
返回html模板
Flask可以以HTML形式返回绑定到某个URL的函数的输出。
1 | from flask import Flask |
使用 render_template() 返回一个html文件
从Python代码生成HTML内容非常麻烦,尤其是在需要放置可变数据和Python语言元素(如条件或循环)时。经常需要转义HTML代码。
Flask使用jinga2模板引擎,可以利用Jinja2模板引擎技术,而不需要从函数返回硬编码HTML。
可以通过render_template()函数渲染HTML文件。
Flask将尝试在该脚本所在的同一文件夹中查找templates文件夹中的HTML文件,其中可以动态插入变量数据。 Web模板系统由模板引擎,某种数据源和模板处理器组成。
!!! 需要创建一个 templates 文件夹;templates 文件夹为根目录相对于render_template()
1 | from flask import Flask, render_template |
1 | <html> |
Jinja2模板引擎语法
Jinja2模板引擎使用以下分隔符来从HTML转义。
{% ... %}
用于多行语句{{ ... }}
用于将表达式打印输出到模板- `` 用于未包含在模板输出中的注释
#... ##
用于单行语句
在html模板中使用语法
- if… else…endif
1 | from flask import Flask, render_template |
1 | <!-- ./templates/hello.html --> |
- for循环
1 | from flask import Flask, render_template |
1 | <!-- ./templates/result.html --> |
静态文件
Web应用程序通常需要一个静态文件,例如支持显示网页的JavaScript文件或CSS文件。它将在应用程序的/static上提供
1 | from flask import Flask, render_template |
1 | <!-- ./templates/index.html --> |
1 | // ./static/hello.js |
请求对象
当处理请求时,可以使用 Flask 的 request 对象来访问客户端发送的数据。以下是对 request 对象中常用属性的详细说明,并说明如何设置和获取这些属性以及需要注意的事项:
form
属性:- 设置:在处理包含表单数据的 POST 请求时,可以通过 HTML 表单提交数据来设置此属性。
- 获取:使用
request.form['key']
来获取特定表单字段的值。 - 注意事项:确保在访问 form 属性之前检查请求方法是否为 POST,以免意外访问到无效数据。
args
属性:- 设置:直接在 URL 中添加查询参数来设置此属性。
- 获取:使用
request.args.get('key')
来获取特定查询参数的值。 - 注意事项:要小心处理从 URL 中获取的用户输入数据,以防止恶意输入或不安全字符。
cookies
属性:- 设置:通过响应对象中设置 Set-Cookie 头部信息来设置此属性。
- 获取:使用
request.cookies.get('key')
来获取特定 Cookie 的值。 - 注意事项: 要谨慎处理敏感信息,并考虑安全性和隐私问题。
file
属性: - 设置: 在 HTML 表单中添加文件上传控件,并将文件上传到服务器时,会自动填充该字段 - 获取: 使用 request.files[‘file_key’] 来访问上传文件对象 - 注意事项: 需要确保对于接收和存储上传文件做好必要的安全验证和限制method
属性: - 获取当前请求方法(GET、POST等), - 不需要手动设置此属性
以上就是对 Flask 请求对象中常用属性及其操作方式、注意事项进行了详细介绍。在实际编码过程中,请根据具体场景谨慎操作并遵循最佳实践以确保代码安全可靠。
表单处理
通过post方法提交from表单数据
1 | from flask import Flask, render_template, request |
1 | <!-- 表格提交 ./template/index.html --> |
1 | <!-- 提交表格后的信息展示 ./template/result.html --> |
!!! 通过上述表单处理方式有个问题就是提交后的数据没办法保留;可以通过cookie或者session的方式保存信息或者当前会话;
Cookie 处理
Cookie以文本文件的形式存储在客户端计算机上。 其目的是记住和跟踪与客户使用有关的数据,以获得更好的访问体验和网站统计。
Request对象包含一个cookie的属性。 它是所有cookie变量及其对应值的字典对象,客户端已发送。 除此之外,cookie还会存储其到期时间,路径和站点的域名。
在Flask中,cookies设置在响应对象上。 使用make_response()函数从视图函数的返回值中获取响应对象。 之后,使用响应对象的set_cookie()函数来存储cookie。
重读cookie很容易。 可以使用request.cookies属性的get()方法来读取cookie。
1 | # server |
1 | <!-- 表格提交 ./template/index.html --> |
1 | <!-- 提交表格后的信息展示 ./template/result.html --> |
使用set_cookie 将存储在cookie的信息一同发给用户,记录在浏览器端 ( 避免敏感信息)
后续在请求中就会在请求中带上这上Cookie
当设置过期时间时,会将有效时间保存在浏览器端;cookie 的过期时间是由客户端(浏览器)管理的,当客户端发送包含过期 cookie 的请求时,服务器会像处理未过期的 cookie 一样处理它
Session 处理
Flask 可以通过 app.secret_key 给当前 app server 添加session会话id,用来保存当前会话的信息
1 | # server |
1 | <!-- 表格提交 ./template/index.html --> |
1 | <!-- 提交表格后的信息展示 ./template/result.html --> |
当提交表单是会向session设置’result’字段,同时向浏览器Cookie中记录当前session
后续在请求中就会在请求头中带上这个Set-Cookie
添加会话变量
1
session['username'] = 'admin'
删除会话变量
1
session.pop('username', None)
Token 处理
pass
消息闪现 - 对话框或消息框 >>>
一个基于GUI好的应用程序需要向用户提供交互的反馈信息。 例如,桌面应用程序使用对话框或消息框,JavaScript使用alert()函数用于类似的目的;
Flask框架的闪现系统使得可以在一个视图中创建一个消息并将其呈现在名为next的视图函数中。
flash()
Flask模块包含flash()方法。 它将消息传递给下一个请求,该请求通常是一个模板。
1
2
3
4
5flash(message, category)
'''
message - 参数是要刷新的实际消息。
category - 参数是可选的。 它可以是’错误’,’信息’或’警告’。
'''get_flashed_messages()
要从会话中删除消息,模板调用get_flashed_messages()函数。
1
2
3
4
5
6get_flashed_messages(with_categories, category_filter)
'''
两个参数都是可选的
第一个参数是元组
第二个参数对于仅显示特定消息有用。
'''
文件上传
Flask中处理文件上传非常简单。 它需要一个enctype属性设置为’multipart/form-data’的HTML表单,将该文提交到指定URL。 URL处理程序从request.files[]对象中提取文件并将其保存到所需的位置。
每个上传的文件首先保存在服务器上的临时位置,然后再保存到最终位置。 目标文件的名称可以是硬编码的,也可以从request.files [file]对象的filename属性中获取。 但是,建议使用secure_filename()函数获取它的安全版本。
Flask对象的配置设置中定义默认上传文件夹的路径和上传文件的最大大小。
变量 | 说明 |
---|---|
app.config[‘UPLOAD_FOLDER’] | 定义上传文件夹的路径 |
app.config[‘MAX_CONTENT_PATH’] | 指定要上传的文件的最大大小 - 以字节为单位 |
1 | from flask import Flask, render_template, request |
SQLite
其特点为:
- 零配置,无需安装和管理配置;
- 储存在单一磁盘文件中的一个完整的数据库;
- 数据库文件可以在不同字节顺序的机器间自由的共享;
- 足够小, 大致13万行C代码, 4.43M,支持数据库大小可至2TB;
- 数据库操作快;
- 不需要任何外部的依赖。
存储类 | 描述 |
---|---|
NULL | 值是一个 NULL 值。 |
INTEGER | 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。 |
REAL | 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。 |
TEXT | 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。 |
BLOB | 值是一个 blob 数据,完全根据它的输入存储 |
创建一个SQLite数据库
创建一个SQLite数据库 ‘database.db’并在其中创建一个student表。1
2
3
4
5
6
7
8import sqlite3
# 创建连接SQLite数据库 *‘database.db’*
conn = sqlite3.connect('database.db')
print("Opened database successfully");
# 创建一个student表,并输入字段与字段类型 name TEXT, addr TEXT, city TEXT, pin TEXT
conn.execute('CREATE TABLE students (name TEXT, addr TEXT, city TEXT, pin TEXT)') #执行单条sql语句
print("Table created successfully");
conn.close()案例 - 通过html向flask后端服务存储SQlite 学生数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49from flask import Flask, render_template, request
from werkzeug import secure_filename
# 创建实例
app = Flask(__name__)
# 访问主页面返回index.html
def new_student():
return render_template('index.html')
# 访问 '/create' 渲染添加学生信息模板
def create_student():
return render_template('addStudent.html') #渲染addStudent.html模板
# 添加到数据库中
def add_student():
try:
#获取请求中的数据
nm = request.form['name']
addr = request.form['address']
city = request.form['city']
pin = request.form['postcode']
with sqlite3.connect("database.db") as con: #建立与database.db数据库的连接
cur = con.cursor() #获取游标
cur.execute("INSERT INTO students (name,addr,city,pin) VALUES (?,?,?,?)",(nm,addr,city,pin) ) #添加数据,执行单条的sql语句
con.commit() #提交事务
msg = "数据添加成功"
except:
con.rollback() #撤消当前事务中所做的所有更改
msg = "操作失败"
finally:
return render_template("result.html",msg = msg) #渲染result.html模板并传递msg值
con.close() #关闭数据库连接
# 查询数据库数据
def show_student():
con = sqlite3.connect("database.db") #建立数据库连接
con.row_factory = sqlite3.Row #设置row_factory,对查询到的数据,通过字段名获取列数据
cur = con.cursor() #获取游标
cur.execute("select * from students") #执行sql语句选择数据表
rows = cur.fetchall() #获取多条记录数据
return render_template("studentList.html",rows = rows) #渲染show.html模板并传递rows值
if __name__ == '__main__':
app.run(debug = True)1
2
3
4
5
6
7
8
9
10
11
12
13
14<!-- index.html -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>学生系统</title>
</head>
<body>
<div>
<a href='/create'>添加学生信息</a>
<span> | </span>
<a href='/studentList'>学生信息列表</a>
</div>
</body>
</html>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<!-- addStudent.html -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Title</title>
</head>
<body>
<!-- 向add_student函数传递from表单数据 -->
<form action = "{{ url_for('add_student') }}" method = "POST">
<p>姓名<input type="text" name="name" /></p>
<p>地址<textarea name="address" ></textarea></p>
<p>城市<input type="text" name="city" /></p>
<p>邮编<input type="text" name="postcode" /></p>
<input type="submit" value="提交" />
</form>
</body>
</html>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34<!-- studentList.html -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flask示例</title>
<style type="text/css">
body {background-color: #ffffcc;}
div {width: 500px; margin: 0 auto;text-align: center;}
table {margin: 0 auto;}
td {border:1px solid black;}
</style>
</style>
</head>
<body>
<div>
<thead>
<td>改名</td>
<td>地址</td>
<td>城市</td>
<td>编码</td>
</thead>
{% for row in rows %}
<tr>
<td>{{row["name"]}}</td>
<td>{{row["addr"]}}</td>
<td>{{row["city"]}}</td>
<td>{{row['pin']}}</td>
</tr>
{% endfor %}
</table>
<div><a href = "/">返回主页</a></div>
</div>
</body>
</html>
扩展 - Flask-SQLAlchemy
ORM(对象关系映射)
RDBMS服务器中的数据以表格形式存储。 对象关系映射是一种将对象参数映射到底层RDBMS表结构的技术。 ORM API提供了执行CRUD操作的方法,而无需编写原始SQL语句。
安装
1
2pip install flask-sqlalchemy
pip install pymysql从该模块导入SQLAlchemy类。
1
from flask_sqlalchemy import SQLAlchemy
创建一个Flask应用程序对象并为要使用的数据库设置URI。
1
2app = Flask(__name__)
app.config['DATABASE_URL'] = 'mysql://root:root@127.0.0.1/blog'然后用应用程序对象作为参数创建一个SQLAlchemy类的对象。 该对象包含ORM操作的辅助函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17db = SQLAlchemy(app)
class students(db.Model):
# 定义这个类使用的数据库
id = db.Column('student_id', db.Integer, primary_key = True)
# 定义字段
name = db.Column(db.String(100))
city = db.Column(db.String(50))
addr = db.Column(db.String(200))
pin = db.Column(db.String(10))
# 初始化实例赋值
def __init__(self, name, city, addr,pin):
self.name = name
self.city = city
self.addr = addr
self.pin = pin创建/使用URI中提到的数据库,请运行create_all()方法
创建数据库中所有尚未在数据库中存在的表。这个函数通常在开发过程中使用,特别是当你添加、修改了模型类后需要将这些变化同步到数据库时。
1
2
3
4
5# 创建所有尚未在数据库中存在的表
db.create_all()
'''
请注意,在生产环境中并不推荐使用 create_all() 方法来自动创建表格。相反,建议使用迁移工具来管理和更新数据模型。
'''使用SQLAlchemy的Session对象管理ORM对象的所有持久性操作
增 - db.session.add(模型对象) - 将一条记录插入到映射表中
1
2
3
4# 假设我们有一个名为User的模型
new_user = User(username='john_doe', email='john.doe@example.com')
db.session.add(new_user) # 将新用户对象添加到会话中
db.session.commit() # 提交更改到数据库删 - db.session.delete(模型对象) - 从表中删除记录
1
2
3
4# 假设我们有一个名为User的模型
user = User.query.get(1) # 获取ID为1的用户
db.session.delete(user) # 删除用户记录
db.session.commit() # 提交更改到数据库查 - model.query.all() - 从表中检索所有记录(对应于SELECT查询)。
1
2
3@app.route('/')
def show_all():
return render_template('show_all.html', students = students.query.all() )更改 or 查单个数据 - 可以使用filter属性将筛选器应用于检索到的记录集。
1
2
3
4
5
6
7
8
9
10# 获取单个数据
Students.query.filter_by(city = 'Haikou').all()
# 更新数据
# 假设我们有一个名为User的模型,并且存在一个用户名为'john_doe'的用户
user = User.query.filter_by(username='john_doe').first()
if user:
user.email = 'new_email@example.com' # 修改email属性值
db.session.commit() # 提交更改到数据库
驱动包
- MySQL-python:也就是MySQLdb。是对C语言操作 MySQL数据库的一个简单封装。遵循了Python-DB-API v2。但是只支持Python2。
- mysqlclient:是 MySQL-python的另外一个分支。支持Python3并且修复了一些bug。是目前为止执行效率最高的驱动,但是安装的时候容易因为环境问题出错。
- pymysql:纯 Python实现的一个驱动。因为是纯 Python编写的,因此执行效率不如 mysqlclient。也正因为是纯 Python写的,因此可以和 Python代码无缝衔接。
- mysql-connector-python: MySQL官方推出的纯 Python连接MySQL的驱动,执行效率pymysql还慢。
扩展 - Flask-restful
Flask-RESTful 是一个 Flask 扩展,它添加了快速构建 REST APIs 的支持。它当然也是一个能够跟你现有的ORM/库协同工作的轻量级的扩展。
RESTful 风格 设计介绍
REST 系统的特点:
- 客户端-服务器: 客户端和服务器之间隔离,服务器提供服务,客户端进行消费。
- 无状态: 从客户端到服务器的每个请求都必须包含理解请求所必需的信息。换句话说, 服务器不会存储客户端上一次请求的信息用来给下一次使用。
- 可缓存: 服务器必须明示客户端请求能否缓存。
- 分层系统: 客户端和服务器之间的通信应该以一种标准的方式,就是中间层代替服务器做出响应的时候,客户端不需要做任何变动。
- 统一的接口: 服务器和客户端的通信方法必须是统一的。
- 按需编码: 服务器可以提供可执行代码或脚本,为客户端在它们的环境中执行。这个约束是唯一一个是可选的。
1 | HTTP 标准的方法有如下: |
安装
1 | pip install flask-restful |
创建请求方法
1 | from flask import Flask |
1 | from flask import Flask, request |
设置多个路由端点
1 | from flask import Flask |
案例:todoList
1 | from flask import Flask |
字段类型定义 - fields & 接口类型推断 - @marshal_with()
1 | # 基本用法 |
自定义字段类型匹配 - fields.Raw
1 | from flask_restful import fields |
扁平化处理 - 结构重组( marshal)
- 字典字段 - { }
1 | # 字典字段 |
- 列表字段 - [ ]
1 | # 列表字段 |
- 嵌套类型
1 | from flask_restful import fields, marshal |
内容协商
1 | app = Flask(__name__) |
扩展 - Flask-WTF
使用Flask-WTF,可以在Python脚本中定义表单域并使用HTML模板来呈现它们。 也可以将验证应用于WTF字段
安装依赖
1
pip install flask-WTF
Form类,该类必须用作用户定义表单的父级,标准表单字段
编号 标准表单字段 描述 1 TextField 表示 HTML表单元素 2 BooleanField 表示 HTML表单元素 3 DecimalField 用小数显示数字的文本字段 4 IntegerField 用于显示整数的文本字段 5 RadioField 表示的HTML表单元素 6 SelectField 表示选择表单元素 7 TextAreaField 表示 html表单元素 8 PasswordField 表示 HTML表单元素 9 SubmitField 表示表单元素 案例 - 一个包含文本字段的表单
1
2
3
4
5from flask_wtf import Form
from wtforms import TextField
# 除了name字段之外,还会自动创建一个CSRF令牌的隐藏字段。 这是为了防止跨站请求伪造攻击。
class ContactForm(Form):
name = TextField("Name Of Student")
扩展 - Flask-Testing
扩展 - Flask-PyMongo
扩展 - Flask-Mail
基于Web的应用程序通常需要具有向用户/客户端发送邮件的功能。 Flask-Mail扩展
安装扩展
1
pip install Flask-Mail
配置Flask-Mail
编号 | 参数 | 描述 |
---|---|---|
1 | MAIL_SERVER | 邮件服务器的名称/IP地址 |
2 | MAIL_PORT | 所用服务器的端口号 |
3 | MAIL_USE_TLS | 启用/禁用传输安全层加密 |
4 | MAIL_USE_SSL | 启用/禁用安全套接字层加密 |
5 | MAIL_DEBUG | 调试支持,默认是Flask应用程序的调试状态 |
6 | MAIL_USERNAME | 发件人的用户名 |
7 | MAIL_PASSWORD | 发件人的密码 |
8 | MAIL_DEFAULT_SENDER | 设置默认发件人 |
9 | MAIL_MAX_EMAILS | 设置要发送的最大邮件 |
10 | MAIL_SUPPRESS_SEND | 如果app.testing设置为true,则发送被抑制 |
11 | MAIL_ASCII_ATTACHMENTS | 如果设置为true,则将附加的文件名转换为ASCII |
flask-mail模块包含以下重要类的定义
Mail类
它管理电子邮件消息的要求。 类构造函数采用以下形式
编号 方法 描述 1 send() 发送Message类对象的内容 2 connect() 与邮件主机打开连接 3 send_message() 发送消息对象 Message类
它封装了一封电子邮件,Message类的构造函数有几个参数
1
2flask-mail.Message(subject, recipients, body, html, sender, cc, bcc,
reply-to, date, charset, extra_headers, mail_options, rcpt_options)Message类方法
- attach() - 向消息添加附件。 该方法采用以下参数
- filename - 要附加的文件的名称
- content_type - 文件的MIME类型
- data - 原始文件数据
- disposition - 内容处置
- add_recipient() - 向消息添加另一个收件人
- attach() - 向消息添加附件。 该方法采用以下参数
代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47# 第1步 flask-mail模块导入Mail和Message类
from flask_mail import Mail, Message
# 第2步 - 然后根据以下设置配置Flask-Mail。
app.config['MAIL_SERVER']='smtp.gmail.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USERNAME'] = 'yourId@gmail.com'
app.config['MAIL_PASSWORD'] = '*****'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
# 第3步 - 创建一个Mail类的实例
mail = Mail(app)
# 第4步 - 在由URL规则映射的Python函数(‘/‘)中设置Message对象
def index():
msg = Message('Hello', sender = 'yourId@gmail.com', recipients = ['id1@gmail.com'])
msg.body = "This is the email body"
mail.send(msg)
return "Sent"
# 第5步 - 整个代码如下。 在Python Shell中运行以下脚本并访问URL: http://localhost:5000/
from flask import Flask
from flask_mail import Mail, Message
# 创建app实例
app =Flask(__name__)
# 设置mail信息
mail=Mail(app)
app.config['MAIL_SERVER']='smtp.gmail.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USERNAME'] = 'yourId@gmail.com'
app.config['MAIL_PASSWORD'] = '*****'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
mail = Mail(app)
def index():
msg = Message('Hello', sender = 'yourId@gmail.com', recipients = ['id1@gmail.com'])
msg.body = "Hello Flask message sent from Flask-Mail"
mail.send(msg)
return "Sent"
if __name__ == '__main__':
app.run(debug = True)