zzxworld

Python Web 开发框架 - Sanic 初探

最近几年,我一直使用 Laravel 作为项目中主要的 Web 应用开发框架。Laravel 带给我的开发体验很棒,但受限于 PHP 语言的一些特性,我开始寻找一个在结构上可以更加精简和灵活的 Web 开发框架。目前我的选择是 Sanic

选择 Sanic

首先从使用体验上来说,Laravel 给我的感受是可以和 Rails 相媲美的。我喜欢 Laravel,让我想要放弃 Laravel 的原因如下:

  • 成为一名自由职业者后,涉及的项目大多比较「小巧」。Laravel 默认的功能,项目结构让我觉得有些臃肿。
  • 微服务的概念让我觉得 PHP 的 FPM 这种进程管理工具在线上部署环节有点多余。
  • PHP 最近几年的版本更新过于频繁,让我感到焦虑。
  • PHP 语言本身的一些陈年特性让我一直不太愉悦。比如每个源文件前都必须要有的 <?php 符号,以及变量前的 $ 符号。

所以这是一份充满个人主观的选择,而且我的意图也很明显,就是换掉 PHP,另选一门主开发语言。我希望这门新语言依然适用于 Web 开发领域。

在尝试了 Golang、Crystal、Ruby 和 Python 后,我决定选择 Python。关于原因,首先从微服务的愿景出发,Golang 和 Crystal 应该说是最理想的选择。问题是我无法适应 Golang 「怪异」的语法约定,Crystal 目前不太健全的生态也让我望而却步。Ruby 在语法层面是我的完美之选,不过综合性能表现,语言用途和扩展包的数量来衡量,Python 还是更能节省开发时间。

而具体到 Python 的 Web 开发框架,也是选择众多。比如 Django 和 Flask 就是其中两个优秀的代表。我没有选择这俩的原因就是线上部署必须搭配 Gunicorn 这种 WSGI(Web Server Gateway Interface) 网关服务器。Sanic 因为内置了可用于线上服务的 Web 服务功能,所以部署时完全可以抛弃网关,直接运行程序对外进行服务。这对我来说,大大简化了线上的部署流程和方式。

安装 Sanic

在搭建好 Python 基础运行环境后,就可以通过 pip 命令来安装 Sanic:

pip install sanic

然后就可以创建一个简单的 Python 代码文件 server.py,来验证一下 Sanic 的运行。代码如下:

from sanic import Sanic
from sanic.response import text

app = Sanic('SanicDemo')

@app.get('/')
def home(request):
    return text('Hello, Sanic!')

接下来通过以下命令来运行这个 Sanic 程序:

sanic server.app

注意 server 后面的后缀,不是 py,而是 app。运行命令后,在终端会显示如下画面:

Screenshort 1

打开浏览器,输入 localhost:8000,就能看到如下输出:

Screenshort 2

使用 Sanic

习惯了 Laravel 或者说 Rails 这种「最佳实践」的框架后,对 Sanic 这种类似一张白板的开发框架是非常不适应的。这有点类似于把一个只去游泳池的人带到野外水域,如何开始都成了一个问题。目前来看,我接下来需要解决这些问题:

  1. 定义适合自己的项目文件和目录结构。
  2. 常用功能扩展的引入。
  3. 线上部署流程和工具的测试。

在没有解决这些问题之前,我还无法分享一些有帮助的建议和信息。Python 虽然之前也学过,但完全还没有达到像使用 PHP 这般随心所欲的地步,所以从语言层面看,也还需要投入大量时间来熟悉并掌握。这是更换一门开发语言以及技术框架的代价。

后期我将会从一个实际项目入手,从 Laravel 切换到 Sanic 框架上来。完成这项工作后,应该会出一篇总结性的文章,来分享一下自己过程中碰到的问题,以及如何使用 Sanic 的说明。敬请期待。


2022-02-20:总结来了。

2 条评论

  1. 林林
    报告一下:Blogfinder 的 HTML LANG 属性有问题,声明成英语了。
    • zzxworld
      😀 感谢提醒。一直没太在意这个属性,已经调整。给你的细心点赞。👍