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

《FastAPI,YYDS!》有1条评论

  1. library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;

    entity lab6 is
    port(clk,clr:in std_logic;
    q :buffer std_logic_vector(3 downto 0);
    f :buffer std_logic_vector(6 downto 0);
    co :out std_logic);
    end entity lab6;

    architecture args_lab6 of lab6 is
    begin
    process(clk,clr,q)
    begin
    if (clk’event) and (clk=’1′) then
    if clr=’0′ then
    q <= "0000";
    co = “1001” then
    q <= "0000";
    co <= '1';
    else
    q <= q + '1';
    co <= '0';
    end if;
    end if;
    end if;
    end process;

    f <= "1111110" when q="0000" else
    "0110000" when q="0001" else
    "1101101" when q="0010" else
    "1111001" when q="0011" else
    "0110011" when q="0100" else
    "1011011" when q="0101" else
    "1011111" when q="0110" else
    "1110000" when q="0111" else
    "1111111" when q="1000" else
    "1111011" when q="1001" else
    "0000000";
    end args_lab6;

    回复

回复 code 取消回复