FastAPI,YYDS!

写一个简单的收作业网站

我们的数电助教和老师很奇怪,并不使用常见的课堂派/爱课堂等方式收作业,而是采用纸质的方式收取作业。最近因为疫情反弹的原因,课程重新改为线上,需要收电子版作业。考虑到用 QQ 或 Email 的方式发作业会混乱不堪,我决定在 1024 程序员节的末尾快速写一个收 .pdf 文件的网站,预计从开写到完成在 1 小时左右,算上上线在 2 小时左右,主要需求就两个:能用且不丢数据

网站的结构很简单,出于对快速出活、一定可用的需求的考量,我决定直接用传统的方式渲染 HTML 模板,前端 UI 直接用 bootstrap 和 jQuery 随手撸一个。

BootStrap V5 不再需要 jQuery 作为依赖,但是写项目并不能真正脱离 jQuery。
BootStrap V5 不再需要 jQuery 作为依赖,但是写项目并不能真正脱离 jQuery。

但是,后端的选择是很多样化的。由于这个系统实在是太小了,核心功能只需要两个接口(当然后面零零总总添加的功能比较杂),所以完全可以用一些不了解的框架做 demo。

Rocket v0.5 ?

一开始,我是想用一下 Rocket v0.5。此前用 Rocket v0.4 撸出来一个树洞的经历让我感觉到 rust 事实上具备了很多类似 Java 、 C# 这类语言的语法糖。而且在支持增量编译之后,rust 的开发效率也有了不小的提升。在那个项目中,rocket 的痛点主要有两个:

  • 不支持稳定版的 rust,只能使用 rust nightly;
  • 没有异步支持,使得作为一种编译语言,性能上还比不过很多 gc 语言。

但是当我上手 rocket v0.5 的时候,我的感受是有些崩溃的。它可以顺利地在 rust stable 1.54 下使用。但是,API 的变化是巨大的,这导致先期使用 rocket v0.4 的经验几乎是无效的。这种稳定性极差的体验使得我的编写体验相当别扭,出于 1 小时出活的考虑,我直接抛弃了 Rocket v0.5。(当然,rocket v0.5 最大的意义仍然在 async 上,但在这个项目中,这意义不大。)

Rocket v0.5 曾是我非常期待的,但是它的变化远大于我的想象。
Rocket v0.5 曾是我非常期待的,但是它的变化远大于我的想象。

FastAPI !

如果你问大多数软件工程师:什么语言成品速度最快?我想绝大多数人都会告诉你:Python。(“PHP 是世界上最好的语言!”党除外。)很多网站在早期出于快速开发功能的考虑,都会在早期使用 Python (如:知乎),不过由于优化成本比较高而且坑点略多的缘故,很多 Python 企业最终会逐步向 Golang (如:知乎) 和 Rust 迁移。

Python 路线下有三个选择:Django、Flask 和 FastAPI。Django 太重了,直接排除。而最近声名鹊起的 FastAPI 拥有简单的用法和强大的并发性能,所以我决定试一试。

FastAPI 的优点主要有以下几点:

  • 标准化:没有混乱的 API 或者私有协议;
  • 符合直觉:基本上是开箱即用;
  • 高性能:不弱于 Node.js 或 Golang;
  • 高效率:具有完善的 Pydantic 处理校验能力;
  • “热更新”:上线之后可以在不断电的情况下直接改代码运行;
  • OpenAPI:可以提供更好的扩展性。

FastAPI 用于快速出活的体验确实是无与伦比的,只用一个小时,项目的后端就基本做到了 “production ready”,而且上线之后也没有遇到更多的 bug,实在是令人惊叹。

感谢

感谢 FastAPI 的开发者 Sebastián Ramírez !

FastAPI 的开发者 : Sebastián Ramírez
FastAPI 的开发者 : Sebastián Ramírez

发表评论