准备工作
背景
Flask 诞生于 2010 年,是 Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的 轻量级 Web 开发框架。
Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展 Flask-Mail,用户认证 Flask-Login,数据库 Flask-SQLAlchemy ),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入 ORM、JWT、文件上传、身份验证等。 Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。
其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。
Flask的优点
-
轻量级设计与灵活性:Flask 以其轻量级的设计著称,不强制要求复杂的配置,允许开发者根据项目需求自由选择组件和库,非常适合快速开发小型到中型项目。
-
强大的社区和扩展性:Flask 拥有庞大的社区支持和丰富的扩展库,覆盖从数据库操作、身份验证到RESTful API开发等多个方面,使得开发者可以轻松扩展应用功能,应对各种复杂需求。
-
易用性和开发友好:Flask 的 API 设计简洁直观,非常适合初学者快速上手。它内置的开发服务器和调试器,以及对RESTful 路由和Jinja2模板引擎的支持,都大大提高了开发效率和体验。
使用虚拟环境
使用虚拟环境(virtual environment)在开发 Flask 应用程序时有几个显著的好处:
-
隔离项目依赖:每个项目可以拥有自己独立的依赖环境,这意味着不同项目可以使用不同版本的库而互不干扰。这避免了版本冲突,确保了项目依赖的清晰和一致性。
-
环境一致性:通过虚拟环境,可以确保开发、测试和生产环境的一致性。每个环境都可以配置为完全相同的依赖和库版本,从而减少“在我的机器上可以运行”的问题。
-
简化依赖管理:使用虚拟环境可以更方便地管理项目依赖。你可以为每个项目创建一个
requirements.txt
文件,记录所有必需的包及其版本,便于其他开发者或部署环境重现相同的环境。 -
避免系统级污染:不使用虚拟环境可能会导致系统级的Python环境变得混乱,安装的包可能会相互冲突。虚拟环境将所有依赖限制在特定目录下,保护了系统级Python环境的整洁。
-
便于环境迁移和部署:由于所有依赖都被限定在虚拟环境中,将项目从一个机器迁移到另一个机器或部署到服务器上时,只需简单地复制或重建虚拟环境即可,大大简化了部署过程。
-
提高安全性:在虚拟环境中安装的包通常只限于该环境,这降低了因安装不安全或过时的包而带来的安全风险。
虚拟环境
使用 venv
的好处:
-
轻量级和原生支持:
venv
是 Python 的标准库的一部分,无需安装额外的包即可使用。它为创建隔离的 Python 环境提供了简单直接的方法。 -
易于管理依赖:通过创建独立的环境,
venv
允许开发者为每个项目安装特定版本的依赖,避免了不同项目间的依赖冲突。 -
跨平台兼容性:
venv
在所有主流操作系统上都可用,包括 Windows、macOS 和 Linux,确保了良好的跨平台兼容性。
使用 poetry
的好处:
-
依赖管理和构建工具集成:
poetry
不仅管理依赖,还负责项目的构建和打包。它自动处理依赖的解析和版本控制,简化了项目的构建和打包过程。 -
依赖锁定:
poetry
使用pyproject.toml
文件和一个锁定文件(poetry.lock
),确保无论在什么环境下安装,依赖的版本都是一致的。 -
虚拟环境管理:
poetry
可以自动创建和管理虚拟环境,无需手动激活或管理环境路径。 -
发布和版本控制:
poetry
可以直接将包发布到 PyPI,还支持版本控制,简化了包的发布和维护流程。
poetry
相比 venv
的优势:
-
依赖管理的自动化和完整性:
poetry
自动处理依赖解析和版本控制,而venv
主要负责创建隔离环境,依赖管理需要额外的工具(如pip
和requirements.txt
)。 -
更优的依赖锁定机制:
poetry
使用poetry.lock
文件确保依赖的一致性,而venv
依赖于requirements.txt
文件,后者在多人协作时可能不够稳定。 -
集成构建和发布流程:
poetry
提供了从依赖管理到构建、打包、发布的完整工作流,而venv
仅提供环境隔离功能,构建和发布需要其他工具。 -
更好的用户体验:
poetry
的设计旨在提供更流畅的开发体验,从依赖安装到项目打包,整个过程更为简洁和自动化。
总的来说,venv
是一个轻量级且易于使用的环境隔离工具,而 poetry
提供了更全面的依赖管理和项目打包功能,适合需要更高级依赖管理和自动化构建流程的项目。
在flask中使用poetry
在 Flask 项目中使用 Poetry 主要有以下几个原因:
-
依赖管理:Poetry 提供了一种更现代和更简洁的方式来管理 Python 依赖。它通过
pyproject.toml
文件来声明项目依赖,这比传统的requirements.txt
文件更加清晰和易于管理。Poetry 还会自动创建一个poetry.lock
文件来锁定依赖项的确切版本,确保项目在不同环境中的一致性。 -
环境隔离:虽然 Flask 本身使用虚拟环境(如通过
venv
创建的环境)来隔离项目依赖,但 Poetry 内置了虚拟环境管理功能,可以自动创建和管理虚拟环境,简化了环境设置和依赖安装的步骤。 -
构建和打包:Poetry 不仅管理依赖,还支持项目的构建和打包。它可以直接生成
wheel
文件和源码包,简化了将项目打包和发布到 PyPI 的过程。这对于希望将 Flask 应用打包为可分发包的开发者来说非常有用。 -
版本控制:Poetry 允许开发者轻松地管理项目的版本,并且可以方便地发布新版本到 PyPI。这对于维护 Flask 应用的版本历史和分发非常有帮助。
-
依赖解析优化:Poetry 使用先进的依赖解析算法,可以更有效地解决依赖冲突,并且在添加、更新或移除依赖时提供更准确的依赖树。
-
用户体验:Poetry 的命令行工具设计得直观易用,许多常见的操作(如添加依赖、更新依赖、构建项目等)都可以通过简单的命令完成,提高了开发效率。
-
安全性:Poetry 通过其依赖锁定机制,确保了项目依赖的一致性和安全性,减少了因依赖版本不一致导致的安全风险。
综上所述,虽然 Flask 项目可以使用传统的 venv
和 pip
进行依赖管理,但 Poetry 通过提供更全面的依赖管理、环境隔离、构建打包和版本控制等功能,为 Flask 开发者提供了一个更高效、更现代化的开发工作流。
从零开始使用poetry
安装
poetry 是一个命令行工具,安装之后就可以使用 poetry 指令。可以将其安装全局环境或者是虚拟环境,我推荐安装在全局环境,这样在后面使用时不需要单独激活虚拟环境。同时 poetry 也依赖了比较多的模块,每个虚拟环境都安装一次也会比较麻烦。
pip install poetry
安装之后就会在 python 解释器的安装目录下的 Scripts 目录里面出现 poetry.exe,因为在安装 python 解释器是配置过环境变量,然后就可以直接全局使用了。
初始化 poetry 项目
为了方便解说,我们先创建一个新的项目,名称为 poetry-demo
指定都非常简单,建议跟着一步步自己也尝试一下。
1、初始化项目
mkdir poetry-demo
cd poetry-demo
poetry init
然后会跳出来一连串的互动对话,用于创建项目的配置文件,这里我就直接全部一路回车,然后看一下生成的 pyproject.toml 配置文件:
创建虚拟环境
使用指令
poetry env use python
可以看出 poetry 为创建创建一个名为 poetry-demo-c-UarFxq-py3.8的虚拟环境
重点说明
-
poetry env use python 是使用当前命令行下激活的 python 解释器创建虚拟环境
-
也可以将指令最后的 python ,改为 python3、python3.8,之类的,甚至只要需要
3.8,只要确保对于的解释器能够在环境变量中找到。 -
更多的配置可以查看 官方文档
-
-
poetry 默认会将虚拟环境统一放在指定目录,例如刚刚创建的项目就放在
C:\Users\xxp\AppData\Local\pypoetry\Cache\virtualenvs\ 目录当中 -
虚拟环境的命名模式为 项目名-随机数-python版本
对于这种命名我个人是蛮喜欢的,每个项目有一个单独虚拟环境,并且制定了对应的版本,看一眼就能知道自己使用的环境是否正确。
对于 poetry 将虚拟环境统一放在指定路径下,这一点我更偏向于 venv 的做法,也就是把虚拟环境放在项目目录下,方便用于观看依赖包的源码,在做项目部署的时候更方便一些。
所幸 poetry 提供了这样的选项。
在当前项目下创建虚拟环境
我们可以使用 以下指令来查看 poetry 的几个主要设定
poetry config --list
其中 virtualenvs.create = true 若改为 false,则可以停止 poetry 在检查不到虚拟环境是自动创建的行为模式,但是建议不要改动。
而 virtualenvs.in-project = false 就是我们要修改的目标,使用指令:poetry config virtualenvs.in-project true
先把之前创建的虚拟环境删除
poetry env remove python
重新创建虚拟环境,看一下差异:
poetry env remove python
可以看出:
- 虚拟环境的路径改为项目的根目录下了
- 名称固定位 .venv
个人觉得这样的设定更加简洁优雅。
启动与退出虚拟环境
在项目的根目录下使用以下命令就可以进入到虚拟环境
poetry shell
poetry shell 指令会检查当前目录或上层目录是否存在 pyproject.toml 来确定需要启动的虚拟环境,所以如果不移动到项目的目录下,则会出现错误。
退出虚拟环境就更简单了,只要输入 exit 就可以了。
poetry 指令
poetry 是一个独立的命令行工具,他有自己的指令,需要花费额外的时间与精力学习,相较 pip 更加复杂,这个能是使用 poetry 的一道关卡。好在常用指令其实不超过 10 个,下面就来一一介绍。
安装模块
使用指令:
poetry add
相较于 pip install,我们试试安装 flask 看看会有什么样的变化
展示模块
使用指令:
poetry show
可以看到 poetry 会将所有的信息全部列出来,并且清楚的告知了新增了那些第三方模块。
此时项目中的 pyproject.toml 也发生了变化
这里要说明,安装 flask ,则 pyproject.toml 只会新增 flask = “^3.0.3” 这个字段的第三方模块,其余依赖不会出现在 toml 文件中。
这里是一个非常大的优点,以便区分那些是用户安装的第三方模块,那些是第三方模块一并安装的依赖。
删除模块
使用指令:
poetry remove flask
可以看出连同第三方模块的依赖都被删除了,这点比venv做的好。
输出 Poetry 虚拟环境的 requirements.txt
poetry export -f requirements.txt -o requirements.txt --without-hashes
Poetry 常用指令清单
算来算去,Poetry 的常用指令主要有下面几个:
-
poetry add
: 这个命令用于添加新的依赖到你的pyproject.toml
文件中。你可以指定包名和版本范围,Poetry会自动处理依赖关系。 -
poetry remove
: 使用这个命令可以从你的项目中移除指定的依赖。它会同时更新pyproject.toml
文件和poetry.lock
文件,确保依赖关系保持一致。 -
poetry export
: 这个命令允许你将pyproject.toml
文件中的依赖导出到其他格式,比如requirements.txt
文件,以便在不使用Poetry的环境中使用。 -
poetry env use
: 这个命令用于指定Poetry应该使用哪个Python环境。你可以指定Python解释器的路径,Poetry会根据这个路径创建和管理虚拟环境。 -
poetry shell
: 这个命令会启动一个新的Poetry虚拟环境的shell。在这个shell中,你可以直接运行你的项目,而不需要手动激活虚拟环境。 -
poetry show
: 这个命令用于显示当前项目依赖的列表,包括版本信息。你可以用它来检查哪些包被安装了,以及它们的版本。 -
poetry init
: 这个命令用于初始化一个新的Poetry项目。它会引导你创建pyproject.toml
文件,这是Poetry用来管理项目依赖的核心文件。 -
poetry uninstall
: 这个命令用于从项目中移除指定的依赖包。与poetry remove
类似,但它专注于移除操作,不涉及其他依赖关系的更新。
其中一半,单一项目可能只会用个一两次而已,比如 init 、 install 和 env use ,实际上需要学习的指令并不多。
修改 poetry 镜像源
修改为清华镜像源
poetry source add tsinghua https://pypi.tuna.tsinghua.edu.cn/simple