从 0 到 1,Flask 全网最全教学!蓝图、会话、日志、部署等使用 Flask 搭建中小型企业级项目
什么是 flask?
Flask是一个使用 Python 编写的轻量级 Web 应用框架,它简洁而灵活,适用于开发小型至中型的 Web 应用。本文将介绍 Flask 框架的基本概念、特点以及如何使用 Flask 来快速搭建 Web 应用,争取在两周内,介绍一篇企业级响应速度的轻量级 python Web 框架sanic
和异步数据库SQLAlchemy
。
优点
• 轻量级: 框架本身轻量,但支持使用扩展构建复杂的应用。
• 灵活性: 提供更大的灵活性,开发者可以根据项目需求选择使用的组件。
• RESTful 可请求调度、Jinja2 模板、支持安全 cookie(客户端会话)、符合 WSGI 1.0
缺点
• 缺少一些内置功能: 相对于 Django,一些功能需要通过扩展实现。
• 适用于中小型项目: 对于大型企业级应用,可能需要更多的手动配置。
• 在异步请求响应速度方面,没有
sanic
好
安装 Flask
在已激活的虚拟环境中可以使用如下命令安装 Flask:
pip install Flask
1、创建第一个视图函数
# 导入flask类
from flask import Flask
# 初始化
app = Flask(__name__)
# 使用route()装饰器来告诉Flask触发函数的URL。
@app.route('/')
def index():
return 'Hello World!'
启动
可以使用 flask 命令或者python -m flask
来运行这个应用。你需要使用--app
选项告诉 flask 你的应用名称是什么
flask --app main run
出现了这个错误警告,跳过就好,不影响 falsk 运行,错误原因是因为在开发环境中,Flask 应用程序是使用内置的服务器(如SimpleServer或Lighttpd)运行的,而不是使用 WSGI 服务器。
好啦,打开我们的蓝色链接,我们第一个 flask 程序就写好了
外部服务器(--host)
运行服务的时候,只能本地访问,而网络中的其他电脑却访问不了。缺省(默认)设置就是这样的,我们可以加上--host=0.0.0.0
flask --app main run --host=0.0.0.0
这时候多了一条外网地址,我们使用虚拟机访问一下,访问成功!
调试模式( --debug)
flask --app main run --host=0.0.0.0 --debug
HTML 转义
当返回 HTML ( Flask 中的默认响应类型)时,为了防止注入攻击,所有用户 提供的值在输出渲染前必须被转义。使用Jinja
(这个稍后会介绍)渲染的 HTML 模板会自动执行此操作。
from markupsafe import escape
@app.route("/<name>")# 路由中的 <name> 从 URL 中捕获值并将其传递给视图函数。
def hello(name):
return f"Hello, {escape(name)}!" # escape() 可以手动转义.
那么如果一个用户想要提交其名称为 <script>alert("bad")</script>
,escape
就会转义为文本,预防XSS攻击
。
XSS 攻击详见
https://mp.weixin.qq.com/s/RJcOZuscU07BEPgK89LSrQ
路由
现代 web 应用都使用有意义的 URL ,这样有助于用户记忆,网页会更得到用 户的青睐,提高回头率。
使用 route()
装饰器来把函数绑定到 URL:
@app.route('/')
def index():
return '登录页面'
@app.route('/index')
def hello():
return 'Hello, World'
# 可以为一个函数指定多个规则
@app.route('/page1')
@app.route('/page2')
@app.route('/page3')
def page_handler():
return 'This is a sample page.'
变量规则
通过把 URL 的一部分标记为<converter:variable_name>
,可以选择性的加上一个转换器,为变量指 定规则
@app.route('/user/<username>')
def show_user_profile(username):
return f'用户名: {escape(username)}'
@app.route('/get/<int:get_id>')
def show_post(get_id):
return f'Get请求id: {get_id}'
# 导入flask类
from flask import Flask
# 初始化
app = Flask(__name__)
# 使用route()装饰器来告诉Flask触发函数的URL。
@app.route('/')
def index():
return 'Hello World!'
0
转换器类型 | 介绍 |
string | (缺省||默认值) 接受任何不包含斜杠的文本 |
int | 接受正整数 |
float | 接受正浮点数 |
path | 类似 string ,但可以包含斜杠 |
uuid | 接受 UUID 字符串 |
唯一的 URL/重定向行为
# 导入flask类
from flask import Flask
# 初始化
app = Flask(__name__)
# 使用route()装饰器来告诉Flask触发函数的URL。
@app.route('/')
def index():
return 'Hello World!'
1
projects
的 URL 是中规中矩的,尾部有一个斜杠,看起来就如同一个文 件夹。访问一个没有斜杠结尾的 URL ( /projects
)时 Flask 会自动进 行重定向,帮您在尾部加上一个斜杠( /projects/
),比如访问这个 urlhttp://127.0.0.1:5000/projects
会自动重定向到http://127.0.0.1:5000/projects/
,俩者只有一个斜杠之分
但是,如果访问http://127.0.0.1:5000/about/
about 这个路由后面添加了一个斜杠,就会导致 404
URL 构建
url_for
函数用于构建指定函数的 URL。它把函数名称作为第一个参数。可以接受任意个关键字参数,每个关键参数对应 url 中的变量。未知变量将添加到 URL 中作为查询参数。
# 导入flask类
from flask import Flask
# 初始化
app = Flask(__name__)
# 使用route()装饰器来告诉Flask触发函数的URL。
@app.route('/')
def index():
return 'Hello World!'
2
为什么不在把 URL 写死在模板中,而要使用反转函数 url_for()
动态构建?
HTTP 方法
Web 应用程序使用不同的 HTTP 方法处理 URL。缺省情况下,一个路由只回应 GET 请求。可以使用 route()装饰器的 methods 参数来处理不同的 HTTP 方法。
# 导入flask类
from flask import Flask
# 初始化
app = Flask(__name__)
# 使用route()装饰器来告诉Flask触发函数的URL。
@app.route('/')
def index():
return 'Hello World!'
3
静态文件
# 导入flask类
from flask import Flask
# 初始化
app = Flask(__name__)
# 使用route()装饰器来告诉Flask触发函数的URL。
@app.route('/')
def index():
return 'Hello World!'
4
渲染模板
直接在 Python 中编写 HTML 不仅麻烦,还容易忽视安全问题。Flask 通过集成Jinja2
,简化了 HTML 的生成,自动进行转义,让开发更安全、更高效。
1. 多用途文本生成:模板技术不仅适用于创建 HTML 网页,同样能够用来生成包括 Markdown、纯文本等在内的多种文本文件格式。
2. 网页内容生成:在 web 应用开发中,模板引擎是生成 HTML 页面的关键工具,但它们的应用远不止于此。
3. 扩展性:模板系统的设计使其能够轻松扩展到其他文本格式,如电子邮件所需的纯文本格式,提供灵活性。
4. 多样化应用:模板的通用性使其成为处理不同文本输出需求的理想选择,无论是在线内容还是电子邮件通信。
Tips:flask 会在 templates 文件夹内寻找模板。
构造你的视图函数
# 导入flask类
from flask import Flask
# 初始化
app = Flask(__name__)
# 使用route()装饰器来告诉Flask触发函数的URL。
@app.route('/')
def index():
return 'Hello World!'
5
flask 模板语法和 django 中的模板语法类似,使用模板语法
# 导入flask类
from flask import Flask
# 初始化
app = Flask(__name__)
# 使用route()装饰器来告诉Flask触发函数的URL。
@app.route('/')
def index():
return 'Hello World!'
6
在模板内部可以像使用 url_for()
和 get_flashed_messages()
函数一样访问 config
、 request
、 session
和 g
对象,自动转义缺省开启,确保安全性,如果 name
包含 HTML ,那么会被自动转义。 如果您可以信任某个变量,且知道它是安全的 HTML (例如变量来自一个把 wiki 标记转换为 HTML 的模块),那么可以使用 Markup
类把它标记为安全的,或者在模板中使用 |safe
过滤器,例如
# 导入flask类
from flask import Flask
# 初始化
app = Flask(__name__)
# 使用route()装饰器来告诉Flask触发函数的URL。
@app.route('/')
def index():
return 'Hello World!'
7
使用Markup
# 导入flask类
from flask import Flask
# 初始化
app = Flask(__name__)
# 使用route()装饰器来告诉Flask触发函数的URL。
@app.route('/')
def index():
return 'Hello World!'
8
使用 | safe
# 导入flask类
from flask import Flask
# 初始化
app = Flask(__name__)
# 使用route()装饰器来告诉Flask触发函数的URL。
@app.route('/')
def index():
return 'Hello World!'
9
操作请求数据
在 Flask 中,全局对象request
确实提供了客户端的请求信息,但可能让人疑惑的是,它如何保证在多线程环境下的线程安全。Flask 通过使用**本地环境(Local Environment)**来解决这个问题。每个线程都拥有自己的本地环境,这意味着每个线程的request
对象是独立的,不会与其他线程的request
对象冲突。这样,即使在多线程环境下,每个请求也能安全地处理,而不会相互干扰。
本地环境
Flask 中有些对象看似全局,实则不然。它们是本地对象的代理,意味着每个线程有自己的版本,从而保证了线程安全。这在单元测试时特别有用,因为测试时可能没有真正的请求对象。
要解决这个问题,你可以手动创建一个请求对象。Flask 提供了test_request_context()
,一个方便的环境管理器,让你可以在测试代码中模拟请求。使用它,你可以这样写:
flask --app main run
0
如果需要模拟更完整的环境,比如整个 WSGI 环境,可以使用request_context()
,传入环境变量即可:
flask --app main run
1
简而言之,Flask 让你即使在没有真实请求的情况下,也能轻松测试依赖于请求对象的代码。
请求对象
导入 flask 的request
包
flask --app main run
2
通过使用method
方法,处理当前请求方式
flask --app main run
3
通过使用form
方法,处理获取的请求方式数据
flask --app main run
4
这是你的 html 表单
flask --app main run
5
操作 URL 获取参数比如https://127.0.0.1/index/?page=1 如何取得这个 page 参数
flask --app main run
6
其他方法参考官方文档或者直接查看源代码
文件上传
使用 Flask 上传文件时,确保 HTML 表单包含enctype="multipart/form-data"
,否则文件无法上传,一个简单案例
flask --app main run
7
html
flask --app main run
8
如果想要把客户端的文件名作 为服务器上的文件名,可以通过 Werkzeug
提供的 secure_filename()
函数:
flask --app main run
9
Cookies
访问 cookies ,可以使用 request 的cookies
属性。
flask --app main run --host=0.0.0.0
0
打开浏览器 f12,找到网络中的包即可查看
重定向和错误
使用redirect()
可以重定向。使用abort()
可以更早退出请求,并且返回错误代码:
flask --app main run --host=0.0.0.0
1
让一个用户从索引页重定向到一个无法访问的页 面(401 表示禁止访问)。上例可以说明重定向和出错跳出是如何工作的。
自定义请求状态页面
flask --app main run --host=0.0.0.0
2
关于响应
在 Flask 中,视图函数的返回值会直接生成响应对象。若返回字符串,Flask 将其转换为响应体,附带200 OK
状态码和text/html
内容类型。若返回字典或列表,Flask 自动调用jsonify()
,生成 JSON 格式的响应。这是 Flask 处理响应的基本规则。
1. 直接响应:若视图函数返回的是一个
Response
对象,Flask 将直接使用该对象作为 HTTP 响应返回给客户端。2. 字符串转换:若返回值是字符串,Flask 会将其作为响应体内容,并结合默认参数创建一个响应对象返回。
flask --app main run --host=0.0.0.0
33. 流式响应:如果视图函数返回的是迭代器或生成器,Flask 将按流式响应处理,这意味着响应体内容将逐步发送给客户端。
4. JSON 响应:对于字典或列表类型的返回值,Flask 会通过
jsonify()
函数将它们转换为 JSON 格式的响应对象。flask --app main run --host=0.0.0.0
45. 元组处理:返回值若为元组,它应至少包含一个元素,并且可以提供额外的响应信息,如状态码或头部信息。元组的格式可以是
(body, status)
、(body, headers)
或(body, status, headers)
,其中status
将覆盖默认的状态代码,headers
则添加额外的响应头,一个简单的例子flask --app main run --host=0.0.0.0
56. WSGI 应用:如果返回值不符合以上任何一种类型,Flask 将尝试将返回值作为 WSGI 应用来处理,并将其转换为一个响应对象。
JSON 格式的 API
flask --app main run --host=0.0.0.0
6
会话 session
Session 对象提供了跨请求存储信息的能力。它基于密钥签名的 cookie 实现,用户能够查看但无法修改,除非拥有相应的密钥。这确保了存储在 session 中的数据安全,防止了恶意篡改。所以在使用 session 之前必须设置一个密匙
flask --app main run --host=0.0.0.0
7
如果你不设置这个 key 也会报如下错误
可以在终端使用如下命令生成 key
flask --app main run --host=0.0.0.0
8
Flask 通过序列化会话对象的值并存储在 cookie 中来管理会话。如果请求中未能持续维护会话值,访问时可能失败且错误不明显。开发者应检查 cookie 大小是否符合浏览器限制。此外,Flask 支持通过扩展实现的服务端会话,提供更高安全性,即使客户端禁用 cookie 也能维持会话状态。
CORS 跨域
浏览器的同源策略(Same-Origin Policy)限制了跨域请求,如果不进行特殊处理,跨域请求将被浏览器拦截。
跨域请求提升了应用间的互操作性,尤其有利于前后端分离架构,允许独立开发和部署。但同时,它也可能引入 XSS 和 CSRF 等安全威胁,增加服务器负担,并可能因携带用户信息如 cookies 而泄露隐私。此外,预检请求可能导致网络延迟,影响性能。开发者需在实现时综合考虑安全性和性能,采取必要措施以保护数据和提升用户体验。
1、使用单个跨域 在 Flask 框架中,@app.route
装饰器用于定义路由,包括指定的 URL 路径和允许的 HTTP 请求方法。而@cross_origin
装饰器则用于配置跨域资源共享(CORS),允许指定哪些域名可以访问该资源,以及允许使用哪些 HTTP 方法。
如果两个装饰器都指定了请求方法,它们的作用是不同的。@app.route
的指定方法决定了哪些 HTTP 请求能够触发关联的视图函数。相比之下,@cross_origin
中的请求方法设置只影响跨域请求的响应,例如,它决定了在预检请求(preflight request)中哪些方法可以被告知客户端是被允许的。
因此,即使两者都提到了请求方法,它们并不冲突,因为它们服务于不同的目的。@app.route
确保了请求方法的匹配,而@cross_origin
则处理了跨域请求的额外安全考量。开发者在使用时应确保两者的设置正确无误,以避免不必要的访问控制问题。
flask --app main run --host=0.0.0.0
9
2、使用全局跨域
Flask 中,可以通过安装flask-cors
扩展来支持跨域请求。
flask --app main run --host=0.0.0.0 --debug
0
导入将 app 加入即可
flask --app main run --host=0.0.0.0 --debug
1
日志
1、应用错误处理
应用程序在运行过程中难免会遇到错误,即使代码本身无懈可击。可能的原因包括客户端断开连接、数据库负载过高、存储空间不足、硬件故障、后台服务过载、依赖库存在缺陷或网络连接问题等。这些问题都是服务器运维中常见的挑战。
2、错误日志工具
嗯,这里介绍几个扩展Sentry
Sentry 可以统计重复错误,捕获堆栈数据和本地变量用于排错,并在发生新的错误时或 者按指定频度发送电子邮件。
flask --app main run --host=0.0.0.0 --debug
2
然后添加如下代码
flask --app main run --host=0.0.0.0 --debug
3
安装好以后,内部服务出错信息会自动向 Sentry 报告,你会接收到出错通知。
3、默认日志 logger 类
下面是默认的日志系统 logger 类
flask --app main run --host=0.0.0.0 --debug
4
4、错误处理器
Flask 通过 HTTP 状态码区分错误类型:400-499 表示客户端错误,500-599 表示服务器错误。
开发者可以通过注册错误处理器来自定义错误页面,这些处理器函数在特定错误发生时被调用,并返回个性化的响应。错误处理器接收一个HTTPException
实例,但返回的响应状态码需手动设置。正确配置错误处理器,可以改善用户体验并提供调试信息。
5、注册出错处理器
通过使用errorhandler()
装饰函数来注册或者稍后使用regist_error_handler()
来注册。记得当返回响应的时候设置的状态码。
flask --app main run --host=0.0.0.0 --debug
5
在 Flask 中,werkzeug.exceptions.HTTPException
及其子类如BadRequest
(其代码为 400)可被注册和抛出。对于非标准 HTTP 代码,Werkzeug 无法直接识别,因此不应直接注册这些异常。正确的做法是定义一个带有合适 HTTP 代码的HTTPException
子类,然后在应用中注册并使用这个自定义异常类。
flask --app main run --host=0.0.0.0 --debug
6
出错处理器可被用于任何异常类的注册,除了 HTTPException
子类或者 HTTP 状态码。 出错处理器可被用于特定类的注册,也可用于一个父类的所有子类的注册。
6、处理
在构建 Flask 应用时,您会遇到异常。如果在处理请求时(且没有注册 错误处理器),你的代码中断了,那么默认返回”500 内部服务器错误“( InternalServerError
)。同样,如果请求被发送到未注册的路由,则会产生”404 未找到“(NotFound
)错误。如果路由接收到被禁止请求方法,则会产生”405 方法访问被禁止“(MethodNotAllowed
)。Flask 默认提供这些HTTPException
Flask 使您能够注册 Werkzeug
提供的任意 HTTP 异常。但是,默认的 HTTP 异 常返回简单的异常页。您可能希望在发生错误时向用户显示自定义错误页面。可 以通过注册错误处理器来完成。
7、通用异常处理器
可以为非常通用的基类注册异常处理器,例如HTTPException
基类或者Exception
基类。但是,请注意,这样会捕捉到超出你预期的异常。
基于 HTTPException
的异常处理器对于把缺省的 HTML 出错页面转换 为 JSON 非常有用,但是这个处理器会触发不由你直接产生的东西,如路由过程 中产生的 404 和 405 错误。请仔细制作你的处理器,确保不会丢失关于 HTTP 错误的信息。
flask --app main run --host=0.0.0.0 --debug
7
注意不能够这样写
flask --app main run --host=0.0.0.0 --debug
8
用于 Exception
的异常处理器有助于改变所有异常处理的表现形式,甚至包含 未处理的异常。但是,与在 Python 使用 except Exception:
类似,这样会捕 获 所有 未处理的异常,包括所有 HTTP 状态码。
因此,在大多数情况下,设定只针对特定异常的处理器比较安全。因为 HTTPException
实例是一个合法的 WSGI 响应,你可以直接传递该实例。
flask --app main run --host=0.0.0.0 --debug
9
异常处理器仍然遵循异常烦类的继承层次。如果同时基于 HTTPException
和 Exception
注册了异常处理器, Exception
处理器不会处理 HTTPException
子类,因为 HTTPException
更有针对性。
8、未处理的异常
当一个异常发生时,如果没有对应的异常处理器,那么就会返回一个 500 内部服务错误。
9、自定义错误页面
在 Flask 应用开发过程中,abort()
函数是一个强大的工具,用于在检测到问题时立即终止请求并抛出一个HTTPException
。这个函数不仅能够向用户明确地反馈错误,还能提供一个简洁的默认错误页面,帮助用户理解发生了什么。
例如,在处理用户配置文件的路由时,如果请求中缺少了用户名,我们可以使用abort(400)
来告知用户请求不完整或格式错误。如果用户提供了用户名,但服务器上找不到对应的用户信息,我们则可以使用abort(404)
来明确告知用户请求的资源不存在。
from markupsafe import escape
@app.route("/<name>")# 路由中的 <name> 从 URL 中捕获值并将其传递给视图函数。
def hello(name):
return f"Hello, {escape(name)}!" # escape() 可以手动转义.
0
通过这种方式,abort()
函数不仅帮助我们优雅地处理错误情况,还能够提供给用户清晰的反馈,增强了应用的用户体验和健壮性。此外,通过自定义错误处理函数,我们还可以进一步定制错误页面,提供更友好的错误信息和解决方案。
一个模板示例
from markupsafe import escape
@app.route("/<name>")# 路由中的 <name> 从 URL 中捕获值并将其传递给视图函数。
def hello(name):
return f"Hello, {escape(name)}!" # escape() 可以手动转义.
1
10、将 API 错误作为 JSON 返回
from markupsafe import escape
@app.route("/<name>")# 路由中的 <name> 从 URL 中捕获值并将其传递给视图函数。
def hello(name):
return f"Hello, {escape(name)}!" # escape() 可以手动转义.
2
当然,还可以创建自定义异常类。
from markupsafe import escape
@app.route("/<name>")# 路由中的 <name> 从 URL 中捕获值并将其传递给视图函数。
def hello(name):
return f"Hello, {escape(name)}!" # escape() 可以手动转义.
3
一个视图现在可以引发带有错误信息的异常。此外,一些额外的内容可以通过 payload 参数,以字典的方式提供。
集成 WSGI 中间件
如果想要在应用中添加一个 WSGI 中间件,那么可以用应用的 wsgi_app
属性来包装。例如,假设需要在 Nginx 后面使用 ProxyFix
中间件,那么可以这样 做:
from markupsafe import escape
@app.route("/<name>")# 路由中的 <name> 从 URL 中捕获值并将其传递给视图函数。
def hello(name):
return f"Hello, {escape(name)}!" # escape() 可以手动转义.
4
用 app.wsgi_app
来包装,而不用 app
包装,意味着 app
仍旧 指向您的 Flask 应用,而不是指向中间件。这样可以继续直接使用和配置 app
。
消息闪现
在 Web 应用中,向用户反馈操作结果很关键,通常通过网页上的文字提示实现,如确认信息、警告或错误提示。
在Flask
中,使用flash message
(闪现消息),具体使用的方法是flash()
from markupsafe import escape
@app.route("/<name>")# 路由中的 <name> 从 URL 中捕获值并将其传递给视图函数。
def hello(name):
return f"Hello, {escape(name)}!" # escape() 可以手动转义.
5
在视图函数中发送了消息,自然的,就需要在模板文件中取出消息,我们使用方法get_flashed_message
from markupsafe import escape
@app.route("/<name>")# 路由中的 <name> 从 URL 中捕获值并将其传递给视图函数。
def hello(name):
return f"Hello, {escape(name)}!" # escape() 可以手动转义.
6
• with_categories: 消息类型,与上面的
flash
匹配• category_filter: 过滤条件例如,
from markupsafe import escape
@app.route("/<name>")# 路由中的 <name> 从 URL 中捕获值并将其传递给视图函数。
def hello(name):
return f"Hello, {escape(name)}!" # escape() 可以手动转义.
7
index.html
模板文件
from markupsafe import escape
@app.route("/<name>")# 路由中的 <name> 从 URL 中捕获值并将其传递给视图函数。
def hello(name):
return f"Hello, {escape(name)}!" # escape() 可以手动转义.
8
login.html
文件内容
from markupsafe import escape
@app.route("/<name>")# 路由中的 <name> 从 URL 中捕获值并将其传递给视图函数。
def hello(name):
return f"Hello, {escape(name)}!" # escape() 可以手动转义.
9
首页
登录失败
登录成功
蓝图(Blueprint)
本文介绍 Flask 蓝图,一种封装路由和视图函数的容器,用于模块化构建客户端请求与 URL 的映射,实现应用的组织
和扩展。 在 Flask 中,使用蓝图可以帮助我们实现模块化应用的功能,比如,现在有一个 users.py 和 main.py 实现用户的登录
users.py
https://mp.weixin.qq.com/s/RJcOZuscU07BEPgK89LSrQ
0
main.py
https://mp.weixin.qq.com/s/RJcOZuscU07BEPgK89LSrQ
1
运行效果,路由在不同文件中的时候也能够正常访问。
强大的 Pandas 数据分析库操作数据库、Excel、CSV 等,配合 flask 使用
后续会出一期 pandas 详细使用教程,pandas,python+data+analysis 的组合缩写,是 python 中基于 numpy 和 matplotlib 的第三方数据分析库,与后两者共同构成了 python 数据分析的基础工具包,享有数分三剑客之名,减少了我们使用原生 sql 语句的使用,如果数据量达到万级别,可以使用pandarallel来提升他的运行效率,介绍一个见到那的案例
https://mp.weixin.qq.com/s/RJcOZuscU07BEPgK89LSrQ
2
如果有朋友需要 pandas 练习题的可以关注我的公众号,【小羽网安】回复【pandas】
总结
Flask 是一个用 Python 编写的轻量级 Web 应用框架,以其简洁和灵活性而著称,非常适合开发小型至中型的 Web 应用。以下是对 Flask 框架的全面总结:
基本特点
• 轻量级:Flask 核心简单,但支持丰富的扩展来构建复杂应用。
• 灵活性:开发者可以根据项目需求选择所需组件。
• RESTful 支持:易于创建符合 REST 风格的接口。
• 模板引擎:内建支持 Jinja2 模板。
• 安全性:支持安全 cookie 和会话管理。
安装与启动
• 安装命令:
pip install Flask
。• 创建应用:定义视图函数并使用
@app.route()
装饰器映射 URL。• 运行应用:使用
flask run
或app.run()
命令启动服务器。
路由
• 使用
@app.route()
装饰器定义路由。• 支持变量规则和多种 HTTP 方法。
模板渲染
• 使用
render_template()
函数渲染 HTML 模板。
请求和响应
• 通过
request
对象访问请求数据。• 视图函数返回值自动转换为响应对象。
错误处理
• 注册错误处理器以自定义错误页面。
会话管理
• 使用
session
对象跨请求存储信息。
蓝图(Blueprint)
• 使用蓝图实现应用的模块化。
静态文件
• 通过
url_for('static', filename='...')
提供静态文件。
JSON 支持
• 内建支持 JSON 数据的序列化和反序列化。
安全性
• 自动转义 HTML 以防止 XSS 攻击。
• 使用
escape()
函数手动转义用户输入。
部署
• 可以部署在外部服务器上,使用
--host=0.0.0.0
选项。
调试模式
• 使用
--debug
选项启动应用,提供错误调试信息。
CORS 跨域请求
• 通过
flask-cors
扩展或@cross_origin
装饰器处理跨域请求。
日志和错误监控
• 使用 Sentry 等工具监控和报告错误。
集成 WSGI 中间件
• 通过
app.wsgi_app
属性集成中间件。
消息闪现
• 使用
flash()
和get_flashed_messages()
在用户会话中显示消息。
测试
•
test_request_context()
和request_context()
帮助模拟请求环境。
文件上传
• 支持文件上传,需设置
enctype="multipart/form-data"
。
集成数据分析
• 与 Pandas 等数据分析库结合,进行数据库和数据文件操作。
总结
Flask 是一个功能强大且灵活的 Web 框架,通过其丰富的扩展和简洁的语法,能够快速开发出从简单到复杂的 Web 应用。其轻量级的特性和对开发者友好的设计,使得 Flask 成为 Python Web 开发中的一个受欢迎的选择。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...