前端转型Python开发:我的项目开发心得分享

发表时间: 2024-07-29 10:23

需要资料,关注我回复111

为何选择Python进行开发?

不久前,我推出了我的首个产品——Siphon吸词,它旨在帮助英语学习者通过阅读来高效积累词汇量。这个产品有一个特色功能:用户在浏览网页时遇到生词,只需双击,即可将其记录到生词本中,并且系统会自动保存生词所在的句子,以便用户理解该词的用法。然而,许多用户反馈说,他们希望在复习时,这些句子能够提供翻译功能。

添加图片注释,不超过 140 字(可选)

为此,我进行了一番调研,并最终发现字节跳动的豆包大模型在翻译质量和速度上表现出色,价格也颇具竞争力。因此,我决定利用豆包大模型的API来实现句子的翻译功能。翻译效果如下:

翻译结果令人满意,英文原文中并未提及"Her"是一部电影,但大模型却能识别出"Her"指的是电影《她》。

不过,豆包大模型目前仅提供了Python的SDK,而我所熟悉的JavaScript和Go语言并未提供官方SDK。同时,我也想借此机会重新学习Python这门语言,因此决定基于Python来实现翻译API。

顺便说一句,多年前我曾系统学习过Python,并用Python编写过一些简单的自动化交易程序。所以,重新上手Python项目开发,配合Copilot的辅助,语言层面并无太大障碍,主要问题还是工程方面的挑战。

使用哪个Web开发框架?


Python的Web开发生态极为丰富,可以用“乱花渐欲迷人眼”来形容。以下是一些知名的开源框架:


- FastAPI,GitHub星星数71.6k;

- Django,GitHub星星数77.1k;

- Flask,GitHub星星数66.6k;

- Tornado,GitHub星星数21.5k;

- Falcon,GitHub星星数9.4k。


可选方案众多。由于我的需求仅是提供API供前端调用,简单浏览了一些热门框架的README文档,并咨询了ChatGPT后,我迅速决定使用FastAPI作为项目的API框架。FastAPI的使用非常简单,以下是一个示例:


```pythonfrom fastapi import FastAPIapp = FastAPI()@app.get("/")def read_root():    return {"Hello": "World"}```

Python中的“虚拟环境”


作为初学者,我虽然听说过Python的虚拟环境,但一开始并未给予太多关注,直到遇到问题。

按照豆包文档的指导,我用pip安装了豆包的SDK,但在编辑器环境和脚本运行时总是报错,无法找到相应的包。经过一番调查,发现问题可能是由于我本地安装了多个版本的Python解释器,它们的安装目录不同。pip安装的全局包位于目录A,而编辑器和代码执行时使用的是另一个解释器,它会在目录B的全局目录中寻找包。于是,“虚拟环境”便应运而生。

什么是“虚拟环境”?

以下是ChatGPT的解释:

在Python开发中,“虚拟环境”(virtual environment)是一个独立的、隔离的Python环境。它包含特定版本的Python解释器及安装在其中的包和库,且与全局的Python环境相互独立。使用虚拟环境可以为不同的项目创建隔离的开发空间,避免包和依赖冲突,确保项目的一致性和可移植性。

虽然这个解释并不完全准确,但可以将其类比为前端开发中的“本地安装”。在前端开发中,npm install默认会将包安装在本地目录中。而Python需要先创建“虚拟环境”,这样后续pip安装的包会安装在虚拟环境中,与全局环境隔离。


如何创建“虚拟环境”?

Python中创建虚拟环境的方法有很多,例如:

- venv

- virtualenv

- pipenv

- conda

- poetry


具体如何使用这些工具,可以查看相关文档,或咨询ChatGPT。在阅读了一些文章后,我选择了poetry,原因如下:

- Poetry使用标准的pyproject.toml文件来定义项目依赖和元数据。

- Poetry支持从项目的元数据直接发布到PyPI或其他包仓库。

- Poetry的依赖解析和安装性能通常比Pipenv更快。

- 近年来,Poetry得到了更多的关注和采用。

虽然我目前还没有明显感受到poetry的优势,但既然许多人推荐使用这个更现代化的工具,我最终选择了它。

以下是一些poetry的常用命令:

```csharp// 初始化项目poetry init// 激活虚拟环境poetry shell// 添加依赖poetry add package_name```

如何基于Docker部署Python项目

与JavaScript类似,Python项目的Dockerfile大致流程如下:

- 首先需要基础镜像。

- 然后复制包管理的lock文件等,安装依赖。

- 接着复制必要的项目文件。

- 最后通过uvicorn启动服务。

实际上,这个过程非常简单,甚至可以让ChatGPT帮你写一个Dockerfile。我遇到的问题是,构建出的镜像大小居然达到了1.2G(我喜欢的Web开发语言Go,镜像通常只有几十M)。

我最后参考了Medium上的一篇文章:"How to make your Python Docker images secure, fast & small",对镜像尺寸进行了优化,最终降至600多M。如果你对此感兴趣,推荐阅读这篇文章。顺便做个小广告,如果你觉得自己的英文阅读能力需要提高,不妨试试我开发的产品Siphon吸词,我亲自使用了两个多月,词汇量和阅读能力都有了明显提升。

最后的Dockerfile大致如下:

```bashFROM python:3.11-slim as buildENV PIP_DEFAULT_TIMEOUT=100 \    PYTHONUNBUFFERED=1 \    PIP_DISABLE_PIP_VERSION_CHECK=1 \    PIP_NO_CACHE_DIR=1 \    POETRY_VERSION=1.3.2WORKDIR /appCOPY pyproject.toml poetry.lock ./RUN pip install "poetry==$POETRY_VERSION" \    && poetry install --no-root --no-ansi --no-interaction \    && poetry export -f requirements.txt -o requirements.txt# Final stageFROM python:3.11-slim as finalWORKDIR /appCOPY --from=build /app/requirements.txt .RUN set -ex \    && addgroup --system --gid 1001 appgroup \    && adduser --system --uid 1001 --gid 1001 --no-create-home appuser \    && apt-get update \    && apt-get upgrade -y \    && pip install -r requirements.txt \    && apt-get autoremove -y \    && apt-get clean -y \    && rm -rf /var/lib/apt/lists/*COPY ./artifacts artifactsCOPY ./api apiEXPOSE 8000CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "8000"]# Set the user to run the applicationUSER appuser```

选择Python进行开发,是因为它的灵活性、丰富的库和框架以及强大的社区支持。通过使用FastAPI、虚拟环境、poetry和Docker,我能够高效地构建、部署和优化我的Python项目。这些工具和实践不仅提高了开发效率,还确保了项目的可维护性和可扩展性。