优秀的编程知识分享平台

网站首页 > 技术文章 正文

小白学习Flask 2.0 快速入门(flask入门教程)

nanyue 2024-10-15 11:34:03 技术文章 4 ℃

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.loadjson.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>"

那该代码做了什么?

  1. 首先,我们导入了Flask该类。此类的实例将是我们的WSGI应用程序。
  2. 接下来,我们创建此类的实例。第一个参数是应用程序的模块或软件包的名称。__name__是适用于大多数情况的便捷快捷方式。这是必需的,以便Flask知道在哪里寻找资源,例如模板和静态文件。
  3. 然后,我们使用route()装饰器告诉Flask哪个URL应该触发我们的函数。
  4. 该函数返回我们要在用户浏览器中显示的消息。默认的内容类型是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.pywsgi.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 不存在,则可能有多种原因。首先,您需要查看错误消息。

最近发表
标签列表