Python Flask
🍦 Python编写的Web应用程序框架,基于Werkzeug WSGI工具包和Jinja2模板引擎,Armin Ronacher带领Pocco团队开发。
1 微框架
- 微框架
- WSGI:Web服务器的网关接口,Web服务器和Web应用程序之间通用接口的规范。
- Werkzeug:一个WSGI工具包,实现了请求、响应对象和实用函数,能在上面构建Web框架。
- jinja2:Python的一个流行模板引擎,Web模板系统将模板与特定数据源组合以呈现动态网页。
- 命令窗口下使用PIP进行安装:
pip install Flask
,测试是否安装成功,新建hello.py文件。app.route(rule, options)
- route()函数是一个装饰器,告诉应用程序哪个URL应该调用相关的函数。
- rule表示与该函数的URL绑定,options是转发给基础rule对象的参数列表。
app.run(host, port, debug, options)
- host:主机名,默认为127.0.0.1(localhost),设为0.0.0.0以使服务器在外部可用。
- port:端口号,默认值为5000。
- debug:默认false,设为true提供调试信息。
- options:要转发到底层的Werkzeug服务器。
1 |
|
1-1 验证测试
- 验证测试
- 命令窗口进入hello.py文件对应的目录中,
python hello.py
执行命令。 - 在浏览器的任务栏中输入“http://127.0.0.1:5000/”,回车进行查看。
- 命令窗口进入hello.py文件对应的目录中,
1 |
|
1-2 调试模式
- 调试模式
- 当应用程序处于开发状态时,如果代码进行了更改,则需要每次都重启更新,操作十分不便。
- 为了避免频繁手动重启更新,可以开启调试模式,如果代码更改了,服务器将自行重新加载。
- 调试模式还提供了一个有用的调试器,用于跟踪应用程序中的错误,有两种语法格式的书写。
1 |
|
1-3 路由技术
- 路由技术
- route()装饰器用于将URL与函数进行绑定,可直接访问想访问的页面,不用再从主页开始导航了。
- 若URL“/hello”规则绑定到hello_world()函数,则浏览器访问“http://localhost:5000/hello”。
- add_url_rule()函数也可以用于将URL与函数进行绑定。
1 |
|
(1) URL构建
- 变量规则
- route()装饰器通过向规则参数添加变量部分,可动态构建URL:
route(/<name>/<variable-name>)
。 - 除默认字符串变量部分外,还可使用转换器构建规则:int、float、path(接受用作目录分隔符的斜杠)。
- 字符串变量:若访问“http://127.0.0.1:5000/hello/Aha”,显示“Hello Aha!”。
- int整数:若访问“http://127.0.0.1:5000/blog/27”,显示“Blog Number 27.”。
- float浮点数:若访问“http://127.0.0.1:5000/rev/2.7”,显示“Revision Number 2.700000.”。
- path目录分隔符
- 若访问“http://127.0.0.1:5000/python/”,显示“Not Found”。
- 若访问“http://127.0.0.1:5000/python”,显示“Hello Python.”。
- 访问“http://127.0.0.1:5000/golang”和“http://127.0.0.1:5000/golang/”都可以正常显示。
- route()装饰器通过向规则参数添加变量部分,可动态构建URL:
- url_for()函数,接受函数名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的变量部分。
- 若访问“http://localhost:5000/user/admin”,显示“Hello Admin.”。
- 若访问“http://localhost:5000/user/mvl”,显示“Hello mvl as Guest.”。
✧ 字符串变量
1 |
|
✧ 整数与浮点
1 |
|
✧ 目录分隔符
1 |
|
✧ url_for()函数
1 |
|
(2) 请求方法
- HEAD:和GET方法相同,但是没有响应体。
- GET:以未加密的形式将数据发送到服务器。
- PUT:用上传的内容替换目标资源的所有当前表示。
- DELETE:删除由URL给出目标资源的所有当前表示。
- POST:用于将HTML表单数据发送到服务器,接收的数据不由服务器缓存。
- Flask路由默认响应GET请求,通过route()装饰器提供的方法参数更改请求。
- 命令窗口下执行Python脚本开启开发服务器,浏览器打开post.html,输入test后提交。
- 此时浏览器跳转“http://localhost:5000/success/test”,页面显示“Welcom test.”。
✧ post.py
1 |
|
✧ post.html
1 |
|
1-4 模板引擎
- 模板引擎
- 视图函数的主要作用是生成请求的响应,这是最简单的请求,Flask使用Jinja2这个模板引擎来渲染模板。
- 视图函数的两个作用是处理业务逻辑,以及返回响应内容,模板则是获取到视图函数的数据结果进行展示。
- 项目下创建templates文件夹,用于存放所有的模板文件,并且在templates目录下创建mould.html模板文件。
1 |
|
(1) mould.py
1 |
|
(2) mould.html
1 |
|
1-5 静态文件
- 静态文件
- Web应用程序通常需要静态文件,例如:JavaScript或CSS文件。
- 一般由应用程序的static文件夹提供,用于生成静态文件的URL。
1 |
|
(1) static.js
1 |
|
(2) static.py
1 |
|
(3) static.html
1 |
|
2 核心内容
- 核心内容
- 来自客户端网页的数据作为全局请求对象发送到服务器,为处理请求数据,应从Flask模块导入。
- 请求对象的属性
- args(解析查询字符串的内容,是问号之后URL的一部分)。
- files(与上传文件有关的数据)、cookies(保存Cookie名称和值的字典对象)。
- method(当前请求方法)、form(字典对象,包含表单参数及其值的键值对)。
2-1 表单展示
1 |
|
(1) formshow.py
1 |
|
(2) stufill.html
1 |
|
(3) stushow.html
1 |
|
2-2 Cookies
- Cookies
- 以文本形式存储于客户端,记录与跟踪用户数据,获得更好的访问者体验和网站统计信息,处理步骤如下。
- 设置cookie:默认是临时cookie,浏览器关闭立即失效,通过max_age设置有效期,单位是秒。
- 获取cookie:通过request.cookies的方式获取,返回的是一个字典,可以获取字典里的相应值。
- 删除cookie:这里删除只是让cookie过期,而非直接删除,通过delete_cookie()方式进行删除。
1 |
|
2-3 会话工作
- 会话工作
- session,客户端登录到服务器并注销服务器的时间间隔,在会话中保存的数据会存储在服务器的临时目录中。
- 为每个客户端的会话分配会话ID,会话数据存储在cookie的顶部,服务器以加密方式对其进行签名。
- Flask需要定义的secret_key进行加密,session也是一个字典对象,包含会话变量和关联值的键值对。
Session['username'] = 'admin'
:设置username会话变量。session.pop('username', None)
:释放username会话变量。
1 |
|
2-4 Redirect
- Redirect
- 函数调用时返回一个响应对象,并将用户重定向到具有指定状态代码的另一目标位置。
- redirect()重定向函数原型:
Flask.redirect(location, statuscode, response)
。 - location(重定向响应的URL)、statuscode(发送到浏览器标头,默认302)、response(用于实例化响应)。
- 状态代码标准化
- HTTP_300_MULTIPLE_CHOICES、HTTP_301_MOVED_PERMANENTLY。
- HTTP_302_FOUND、HTTP_303_SEE_OTHER、HTTP_304_NOT_MODIFIED。
- HTTP_305_USE_PROXY、HTTP_306_RESERVED、HTTP_307_TEMPORARY_REDIRECT。
- 示例:执行应用程序,访问“http://127.0.0.1:5000/”。
- 输入用户名guest,F12查看,点击登录,返回“状态代码: 302 FOUND”。
- 输入用户名admin,点击登录,跳转至“http://127.0.0.1:5000/success”。
1 |
|
(1) redirect.py
1 |
|
(2) redirect.html
1 |
|
2-5 错误代码
- 错误代码
- Flask类具有带错误代码的abort()函数:
Flask.abort(code)
。 - 400(错误请求)、401(未授权)、403(Forbidden资源不可用)、404(Not Found网页不存在)。
- 406(无法使用请求的内容特性响应请求的网页)、415(不支持的媒体类型)、429(请求过多)。
- 更改redirect.py代码,如下所示,执行程序,访问“http://127.0.0.1:5000/”。
- 输入用户名guest,F12查看,点击登录,返回“状态代码: 401 UNAUTHORIZED”。
- 输入用户名admin,点击登录,跳转“http://127.0.0.1:5000/success”,登录成功。
- Flask类具有带错误代码的abort()函数:
1 |
|
2-6 消息闪现
- 消息闪现
- Flask提供了一个方法来使用闪现系统向用户反馈信息,可视图中创建消息,并在名为next的视图函数中呈现。
- 在一个请求结束时记录一个信息,并且在下次(且仅在下一次)求时访问,通常与布局模板结合使用以公开信息。
flash(message, category)
- 该函数会将消息传递给下一个请求,当前请求通常是一个模板。
- message(要闪现的实际消息)、category(error、info或warning,可选)。
get_flashed_messages(with_categories, category_filter)
:会话中删除消息。- 如果接收到的消息具有类别,则第一个参数是元组,第二个参数仅用于显示特定消息。
- 示例:执行程序,访问“http://127.0.0.1:5000/”,点击登录跳转到登录页面。
- 用户名admin,密码1235,提交,显示“错误:无效用户名或密码,请重试!”。
- 重新输入用户名admin,密码admin,提交,跳回登录页面并显示“登录成功!”。
1 |
|
(1) 接收消息
1 |
|
(2) flash.py
1 |
|
(3) flashmess.html
1 |
|
(4) flashlogin.html
1 |
|
2-7 文件上传
- 文件上传
- 需HTML表单,enctype属性设为“multipart/form-data”,将文件发布到URL。
- URL处理程序从
request.files[]
对象中提取文件,并将其保存到所需的位置。 - 每个上传的文件首先保存在服务器的临时位置中,然后再将其保存到最终位置上。
- 目标文件的名称可以是硬编码的,也可以从
request.files[]
对象的属性中获取。secure_filename()
:获取安全版本。app.config['UPLOAD_FOLDER']
:定义上传文件夹的路径。app.config['MAX_CONTENT_LENGTH']
:指定要上传文件大小的最大值(以字节为单位)。
1 |
|
(1) upload.py
1 |
|
(2) upload.html
1 |
|
3 扩展功能
- 扩展功能
- 向Flask应用程序添加特定类型的支持,Flask Extension Registry(扩展注册表)是一个可用的扩展目录。
- 常用扩展包
- Flask-migrate(管理迁移数据库)、Flask-Admin(可扩展的管理接口框架)。
- Flask-script(插入脚本)、Flask-Bable(提供国际化和本地化支持的翻译)。
- Flask-Moment(本地化日期和时间)、Flask-Bootstrap(集成前端的Twitter Bootstrap框架)。
- Flask-Session(Session存储方式指定)、Flask-OpenID(认证)、Flask-RESTful(开发REST API的工具)。
- Flask-Mail(邮件)、Flask-WTF(表单)、Flask-SQLAlchemy(操作数据库)、Flask-Login(认证用户状态)。
- 扩展通常命名为Flask-Foo或Foo-Flask,在PyPI搜索标记为“FRAMEWORK::FLASK”扩展包,通过PIP下载。
3-1 Mail
- Mail
- 通过PIP命令安装Flask-Mail扩展:
pip install Flask-Mail
。 - 参数
- MAIL_SERVER->电子邮件服务器的名称或IP地址、MAIL_PORT->服务器的端口号。
- MAIL_USERNAME->发件人的用户名、MAIL_DEFAULT_SENDER->设置默认发件人。
- MAIL_PASSWORD->发件人的密码、MAIL_MAX_EMAILS->设置要发送的最大邮件数。
- MAIL_ASCII_ATTACHMENTS->如果值设置为True,那么附加的文件名将转换为ASCII。
- MAIL_USE_TLS->启用或禁用传输安全层加密、MAIL_USE_SSL->启用或禁用安全套接字层加密。
- MAIL_DEBUG->默认调试状态、MAIL_SUPPRESS_SEND->app.testing设为True,则发送被抑制。
- 重要类的定义
- Mail类:管理电子邮件消息传递需求,类构造函数为
flask-mail.Mail(app = None)
。send_message()
:发送消息的对象。connect()
:打开与邮件主机的连接。send()
:发送Message类对象的内容。
- Message类:封装一封电子邮件,类构造函数为
flask-mail.Message(subject, ...)
。attach()
:支持向邮件添加相关附件。add_recipient()
:添加另一个收件人。
- Mail类:管理电子邮件消息传递需求,类构造函数为
- 通过PIP命令安装Flask-Mail扩展:
1 |
|
3-2 WTF*
- WTF
- PIP命令安装Flask-WTF扩展:
pip install Flask-WTF
。 - WTforms包中的标准表单字段
- DecimalField->显示带小数的数字文本字段、TextAreaField->
<textarea>
。 - SelectField->选择表单元素、PasswordField->
<input type='password'>
。 - IntegerField->显示整数的文本字段、RadioField->
<input type='radio'>
。 - StringField->
<input type='text'>
、SubmitField-><input type='submit'>
。 - BooleanField->
<input type='checkbox'>
。
- DecimalField->显示带小数的数字文本字段、TextAreaField->
- WTForms包中常用的验证器
- NumberRange->验证给定范围内输入字段中的数字、URL->验证在输入字段中输入的URL。
- DataRequired->检查输入字段是否为空、Email->检查字段中的文本是否遵循电子邮件的ID约定。
- IPAddress->输入字段中验证IP地址、Length->验证输入字段中的字符串长度是否在给定范围内。
- PIP命令安装Flask-WTF扩展:
1 |
|
(1) form.py
1 |
|
(2) formnew.py
1 |
|
(3) formfill.html
1 |
|
(4) formsub.html
1 |
|
3-3 Sijax*
- Sijax
- 即Simple Ajax,可轻松地实现AJAX功能,PIP安装Flask-Sijax扩展:
pip install flask-sijax
。 - Flask-Sijax是一个专门为Flask设计的Sijax扩展,提供了与Flask无缝集成的API,也是个轻量级的库。
- 即Simple Ajax,可轻松地实现AJAX功能,PIP安装Flask-Sijax扩展:
1 |
|
(1) sijaxapp.py
1 |
|
(2) sijaxapp.html
1 |
|
3-4 SQLite
- SQLite
- 通过PIP命令安装SQLite扩展:
pip install sqlite3
。 - SQLite是一种嵌入式数据库管理系统,易于使用无需配置。
- 通过PIP命令安装SQLite扩展:
1 |
|
(1) adox.py
1 |
|
(2) sqloper.py
1 |
|
(3) sqlres.html
1 |
|
(4) sqlstu.html
1 |
|
(5) sqllist.html
1 |
|
(6) sqlhome.html
1 |
|
3-5 SQLAlchemy
- SQLAlchemy
- PIP命令安装Flask-SQLAlchemy扩展:
pip install flask-sqlalchemy
。 - Flask-SQLAlchemy是Flask框架的一个扩展,提供了一种简单易用的方式来操作SQL数据库。
- 使用SQLAlchemy可轻松定义数据模型、查询数据并进行CRUD操作,不必编写原始SQL语句。
- ORM,Object-Relational Mapping,对象关系映射,ORM API提供了执行CRUD操作的方法。
- 大多数编程语言平台是面向对象的,而RDBMS服务器中的数据存储为表。
- ORM将关系数据库表视为对象,把对象参数映射到底层RDBMS表结构中。
- PIP命令安装Flask-SQLAlchemy扩展:
1 |
|
(1) sqlaloper.py
1 |
|
(2) sqlalnew.html
1 |
|
(3) sqlalshow.html
1 |
|
4 即插视图
- 即插视图
- Pluggable Views,一种处理请求的类,可以根据不同的HTTP方法来执行不同的操作。
- 基本原则
- 视图类必须继承自
flask.views.View
或其子类,例如:flask.views.MethodView
。 - 可定义多个HTTP方法(例如:GET、POST、PUT、DELETE等)来处理不同类型的请求。
- 请求到达应用程序时,Flask将使用URL规则匹配器查找与该请求URL相对应的视图函数。
- 如果找到匹配的视图函数,创建该视图类的实例,并调用该类方法(GET等)来处理请求。
- 提供可选装饰器和钩子函数,以便在调用视图方法前后执行例如授权验证、日志记录等操作。
- 视图方法应该返回一个响应对象,通常是响应字符串,或者模板渲染结果,亦或是JSON数据。
- 视图类必须继承自
1 |
|
4-1 方法调度
1 |
|
4-2 装饰视图
1 |
|
(1) decview.py
1 |
|
(2) declogin.html
1 |
|
(3) dechello.html
1 |
|
(4) decerror.html
1 |
|
4-3 API的方法视图*
1 |
|
(1) apiview.py
1 |
|
(2) apidata.json
1 |
|
(3) apiadds.html
1 |
|
(4) apiedit.html
1 |
|
(5) apiusers.html
1 |
|
5 上下文作用域
- 上下文作用域
- 应用上下文,Application Context。
- 是整个Flask应用的上下文环境,用于在不同的线程中共享Flask的应用实例。
- 使用
app.app_context()
显式创建,也可通过Flask的方法和函数隐式创建。
- 请求上下文,Request Context。
- 是在每个HTTP请求中创建的上下文,包含了当前请求及其相关信息。
- 在处理请求的过程中,将创建一个请求上下文,然后将请求对象存储在全局变量request中。
- 可以访问到请求对象、会话对象和其他工具函数,例如:
url_for
、render_template
等。
- 测试上下文,Test Context。
- 是在Flask进行单元测试时使用的上下文环境。
- 可使用
app.test_request_context()
显式创建,也可使用FlaskClient类隐式创建。 - 可以访问到Flask的应用实例、请求对象和响应对象,从而进行针对Flask应用的测试。
- 还可以访问Flask提供的测试工具函数,例如:
jsonify
、make_response
等。
- 应用上下文,Application Context。
5-1 应用上下文
- 应用上下文
- 隐式创建,适用于大多情况。
- 默认的创建方式,运行应用时每个请求都会隐式地创建应用上下文。
- 方便使用,不需要额外的代码就可以在Flask中访问g对象来共享数据。
- 显式创建,适用于特殊场景。
- 需要手动创建应用上下文对象,使用更加灵活,可以在请求之外的地方使用应用上下文对象。
- 例如测试Flask应用时,可能需要显式创建应用上下文来测试应用中的某部分,以确保正确性。
- 隐式创建,适用于大多情况。
(1) 隐式创建
1 |
|
(2) 显式创建
1 |
|
5-2 请求上下文
1 |
|
(1) 回调函数
1 |
|
(2) 错误处理
1 |
|
(3) 全局错误
1 |
|
(4) 异常处理
1 |
|
(5) 日志记录
1 |
|
(6) 销毁回调
1 |
|
(7) 留意代理
1 |
|
5-3 测试上下文
1 |
|
6 蓝图实现模块化
- 蓝图实现模块化
- 允许把不同的URL请求处理程序组成一个蓝图,用于管理应用程序的不同功能部分,使代码易于维护和扩展。
- 每个模块相互独立,可以单独测试和调试,每个蓝图都有自己的路由和视图,可在主应用程序中注册和卸载。
1 |
|
6-1 注册蓝图
1 |
|
6-2 静态文件
1 |
|
6-3 资源文件夹
1 |
|
(1) data.json
1 |
|
(2) module.py
1 |
|
(3) index.html
1 |
|
6-4 蓝图构造URL
1 |
|
7 Flask与Shell结合
1 |
|
- 进入当前文件目录中,鼠标右击Git Bash Here,打开一个终端模拟器,进行以下交互式操作。
1 |
|
Python Flask
https://stitch-top.github.io/2021/12/10/python/python13-python-flask/