网站首页 > 技术文章 正文
Flask以及Flask依赖的5 个 Pallets 项目都发布了新的主版本(下面的链接指向各个项目的主版本变动日志):
Flask 2.0
Werkzeug 2.0
Jinja 3.0
Click 8.0
ItsDangerous 2.0
MarkupSafe 2.0
Flask 从1.x版本升级到 Flask 2.x,使用命令:
pip install -U flask
三个核心特性
一、嵌套蓝本
对于一个比较大的项目,一般会使用蓝本来组织不同的模块。而如果项目非常大,那么嵌套蓝本就可以派上用场了。借助嵌套蓝本支持,你可以在某个蓝本之内再创建多个子蓝本,对项目进行多层模块化组织(而且支持无限嵌套,你可以嵌套很多层):
parent = Blueprint("parent", __name__) # 创建父蓝本
child = Blueprint("child", __name__) # 创建子蓝本
parent.register_blueprint(child, url_prefix="/child") # 把子蓝本注册到父蓝本上
app.register_blueprint(parent, url_prefix="/parent") # 把父蓝本注册到程序实例上
在生成子蓝本的 URL 时需要传入完整的端点链:
url_for('parent.child.create')
/parent/child/create
二、基本的 async/await 支持
Flask 2.0 带来了基本的异步支持,现在你可以定义异步视图(以及异步错误处理函数、异步请求钩子函数),异步支持需要安装async依赖库。
# 使用pip命令先安装async依赖
pip install async
import asyncio
from flask import Flask
app = Flask(__name__)
@app.route('/')
async def say_hello():
await asyncio.sleep(1)
return {'message': 'Hello!'}
三、快捷路由装饰器
新增了下面的快捷路由装饰器:
app.get()
app.post()
app.delete()
app.put()
app.patch()
使用 app.post() 等同于 app.route(methods=['POST']):
from flask import Flask
app = Flask(__name__)
@app.post('/')
def index():
return {'message': 'Hello!'}
注意不要在这些快捷装饰器里传入 methods 参数。如果需要在单个视图处理多个方法的请求,使用 app.route();
其他的有用特性
- 优化了浏览器缓存控制,对 CSS、图片等静态文件做出的变动会在程序重载后立刻更新,不再需要手动清除页面缓存。
- Werkzeug 的 multipart 解析(尤其是大文件上传处理)性能提高了 15 倍。
- 配置对象增加 Config.from_file() 方法支持从任意文件加载器导入配置(比如 toml.load、json.load),未来会取代 Config.from_json() 方法。
- 在使用环境变量 FLASK_APP 指定工厂函数时支持传入关键字参数。
- flask shell 支持 tab 和历史补全(需要安装 readline)。
- CLI 系统优化了找不到程序时的错误处理和错误输出显示,同时修正了 Windows 上的命令行颜色输出。
破坏性变动
主要的破坏性变动(breaking change)是意外的把 send_from_directory() 函数的第二个参数名称直接由 filename 重命名为 path,将会在 2.0.1 加回来(#4019)。
另外 send_file() 函数的三个参数也进行了重命名(旧名称将在 2.1.0 移除):
- attachment_filename -> download_name
- cache_timeout -> max_age
- add_etags -> etag
其他重要变化
- 不再支持 Python 2 和 Python 3.5。
- 所有 Pallets 项目添加 type hinting,这意味着更好的 IDE 自动补全体验。
快速入门
渴望上手吗?该页面很好地介绍了Flask。按照安装来设置项目并首先安装Flask。
一个最小的应用
一个最小的Flask应用程序看起来像这样:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
那该代码做了什么?
- 首先,我们导入了Flask该类。此类的实例将是我们的WSGI应用程序。
- 接下来,我们创建此类的实例。第一个参数是应用程序的模块或软件包的名称。__name__是适用于大多数情况的便捷快捷方式。这是必需的,以便Flask知道在哪里寻找资源,例如模板和静态文件。
- 然后,我们使用route()装饰器告诉Flask哪个URL应该触发我们的函数。
- 该函数返回我们要在用户浏览器中显示的消息。默认的内容类型是HTML,因此字符串中的HTML将由浏览器呈现。
将其另存为hello.py或类似名称。确保不调用您的应用程序,flask.py因为这会与Flask本身发生冲突。
要运行该应用程序,请使用flask命令或 python -m flask。在执行此操作之前,您需要通过导出FLASK_APP环境变量来告诉终端应用程序可以使用 :
> set FLASK_APP=hello
> flask run
* Running on http://127.0.0.1:5000/
应用发现行为
作为快捷方式,如果文件名为app.py或wsgi.py,则不必设置FLASK_APP环境变量。有关更多详细信息,请参见 命令行界面。
这将启动一个非常简单的内置服务器,该服务器足以进行测试,但可能不是您要在生产中使用的服务器。有关部署选项,请参阅“部署选项”。
现在转到http://127.0.0.1:5000/,您应该看到问候世界的问候。
外部可见服务器
如果运行服务器,您将注意到只能从您自己的计算机访问该服务器,而不能从网络中的任何其他计算机访问该服务器。这是默认设置,因为在调试模式下,应用程序的用户可以在计算机上执行任意Python代码。
如果禁用了调试器或信任网络上的用户,则只需添加--host=0.0.0.0到命令行即可使服务器公开可用 :
$ flask run --host=0.0.0.0
这告诉您的操作系统侦听所有公共IP。
如果服务器没有启动怎么办
如果python -m flask失败或flask 不存在,则可能有多种原因。首先,您需要查看错误消息。
猜你喜欢
- 2024-10-15 Python Flask Web表单(flask form表单)
- 2024-10-15 如何在Flask应用程序中使用JSON Web Tokens进行安全认证
- 2024-10-15 综合指南:将 Flask 与 MongoDB 结合使用
- 2024-10-15 python-flask搭建平台,HTML+CSS+JS写前端的web全栈-动画轮播
- 2024-10-15 Flask 表单处理(flask formdata)
- 2024-10-15 三、flask博客项目实战-之表单(flask 表单)
- 2024-10-15 flask python web开发的简单易学框架
- 2024-10-15 Flask-APScheduler使用教程(flask apscheduler)
- 2024-10-15 flask 项目中使用 bootstrapFileInput(进阶篇)
- 2024-10-15 基于flask框架展示数据可视化的一次尝试
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)