Python 裏最強的 Web 框架,早就不是 Django 和 Flask 了

來自:掘金,作者:ConnorZhang

鏈接:https://juejin.cn/post/6944598601674784775

如果說要用 Python 進行 web 開發,我想你一定會告訴我 使用 Flask 或者 Django 再或者 tornado, 用來用去無非就這三種框架。可能逛 github 多的朋友還會說一個 fastapi。但是,皇上,時代變了,大清… 亡了!!!

速度爲先

當下,python 都已經更新到了 Python3.9.3 了,如果你還沒有使用過 asyncio、和 Python3.5 新增的 async/await 語法,那說明你可能真的是桃花源人,問今是何世,不知有漢,無論魏晉了。

在當下,基於 async/await 語法的異步 Web 框架也有很多,在 github 上找一找比比皆是是,那究竟應該選哪一款呢?在 github 上有一個專門測試各種語言各種 Web 框架速度的項目,我們來看一看簡單的數據:

這是所有的 Python Web 框架速度測試,有人可能會問爲什麼不是從 1 開始排序的,因爲這個項目的測試還包含 golang、java、php 等衆多語言的 Web 框架,共有 226 款。這裏我們只用 Python 來做對比。

可以明顯的看到,flask、django、tornado 等老牌的 Python Web 框架已經快要墊底了。

wow, 這個速度絕了。可能你們還在懷疑這個速度如何測試的,給你們看一下測試源碼:

# Disable all logging features
import logging

logging.disable()


from flask import Flask
from meinheld import patch

patch.patch_all()

app = Flask(__name__)


@app.route("/")
def index():
    return ""


@app.route("/user/<int:id>"methods=["GET"])
def user_info(id):
    return str(id)


@app.route("/user"methods=["POST"])
def user():
    return ""
複製代碼
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt


def index(request):
    return HttpResponse(status=200)


def get_user(request, id):
    return HttpResponse(id)


@csrf_exempt
def create_user(request):
    return HttpResponse(status=200)
複製代碼
# Disable all logging features
import logging

logging.disable()


import tornado.httpserver
import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        pass


class UserHandler(tornado.web.RequestHandler):
    def post(self):
        pass


class UserInfoHandler(tornado.web.RequestHandler):
    def get(self, id):
        self.write(id)


app = tornado.web.Application(
    handlers=[
        (r"/", MainHandler),
        (r"/user", UserHandler),
        (r"/user/(\d+)", UserInfoHandler),
    ]
)
複製代碼
# Disable all logging features
import logging

logging.disable()

import multiprocessing

from sanic import Sanic
from sanic.response import text


app = Sanic("benchmark")


@app.route("/")
async def index(request):
    return text("")


@app.route("/user/<id:int>"methods=["GET"])
async def user_info(request, id):
    return text(str(id))


@app.route("/user"methods=["POST"])
async def user(request):
    return text("")


if __name__ == "__main__":
    workers = multiprocessing.cpu_count()
    app.run(host="0.0.0.0"port=3000, workers=workers, debug=False, access_log=False)
複製代碼

就是簡單的不做任何操作,只返回響應,雖然這樣測試沒有任何實際意義,在正常的生產環境中不可能什麼都不做,但是如果所有的框架都如此測試,也算是從一定程度上在同一起跑線上了吧。

OK,就這麼多,說到這裏你也應該知道我想要說的這個異步框架是誰了,沒錯,我們今天的主角就是 Sanic

爲什麼要用異步 Web 框架?

這可能是衆多小夥伴最先想到的問題了吧?我用 Django、Flask 用的好好的,能夠完成正常的任務,爲什麼還要用異步 Web 框架呢?

說到這裏,首先我要反問你你一個問題,你認爲在 Web 開發過程中我們最大的敵人是誰?思考 5 秒鐘,然後看看我的回答:

在 Web 開發的過程中,我們最大的敵人不是用戶,而是阻塞!

是的,而異步可以有效的解決 網絡 I/O 阻塞,文件 I/O 阻塞。具體的阻塞相關的文章推薦查看深入理解 Python 異步編程。由於異步可以提升效率,所以對於 Python 來說,異步是最好的提升性能的方式之一。這也是爲什麼要選擇 異步 Web 框架的原因。

生態環境

可能有的小夥伴還是會說,你爲什麼不推薦 falcon 而是推薦 Sanic ?明明它的速度非常快,要比 Sanic 快了那麼多,那您看一下下面的代碼:

from wsgiref.simple_server import make_server
import falcon


class ThingsResource:
    def on_get(self, req, resp):
        """Handles GET requests"""
        resp.status = falcon.HTTP_200  # This is the default status
        resp.content_type = falcon.MEDIA_TEXT  # Default is JSON, so override
        resp.text = ('\nTwo things awe me most, the starry sky '
                     'above me and the moral law within me.\n'
                     '\n'
                     '    ~ Immanuel Kant\n\n')

app = falcon.App()

things = ThingsResource()

app.add_route('/things', things)

if __name__ == '__main__':
    with make_server('', 8000, app) as httpd:
        print('Serving on port 8000...')

        httpd.serve_forever()

一個狀態碼都要自己定義和填寫的框架,我想它的速度快是值得肯定的,但是對於開發者來說,又有多少的實用價值呢?所以我們選擇框架並不是要選最快的,而是要又快又好用的。

而大多數框架並不具備這樣的生態環境,這應該也是爲什麼大多數 Python 的 Web 開發者願意選擇 Django 、 Flask 、 tornado 的原因。就是因爲它們的生態相對於其他框架要豐富太多太多。

可是,如今不一樣了。Sanic 框架, 從 2016 年 5 月開始 發佈了第一版異步 Web 框架雛形,至今已經走過了 5 個年頭,這 5 年,經過不斷地技術積累,Sanic 已經由一個步履蹣跚的小框架變成了一個健步如飛的穩重框架。

在 awesome-sanic 項目中,記錄了大量的第三方庫,你可以找到任何常用的工具:從 API 到 Authentication,從 Development 到 Frontend,從 Monitoring 到 ORM,從 Caching 到 Queue… 只有你想不到的,沒有它沒有的第三方拓展。

生產環境

以前我在國內的社區中看到過一些小夥伴在問 2020 年了,Sanic 可以用於生產環境了嗎?

答案是肯定的,筆者以親身經歷來作證,從 19 年底,我們就已經將 Sanic 用於生產環境了。彼時的 Sanic 還是 19.9,筆者經歷了 Sanic 19.9 -- 21.3 所有的 Sanic 的版本,眼看着 Sanic 的生態環境變得越來越棒。

還有一個問題可能你們不知道,Sanic 在創建之初目標就是創建一個可以用於生產環境的 Web 框架。可能有些框架會明確的說明框架中自帶的 Run 方法僅用於測試環境,不要使用自帶的 Run 方法用於部署環境。但是 Sanic 所創建的不止是一個用於測試環境的應用,更是可以直接用在生產環境中的應用。省去了使用 unicorn 等部署的煩惱!

文檔完善

想必大多數 Python 的 Web 開發者 學的第一個框架就是 Flask 或者 Django 吧,尤其是 Django 的文檔,我想大多數小夥伴看了都會心塞。因爲舊的版本有中文,但是新的版本,尤其是新特性,完全沒有任何中文文檔了!!!!這對於關注 Django 發展但英文又不是強項的同學來說,簡直苦不堪言。

但 Sanic 擁有完善的 中文用戶指南 和 API 文檔,這些都是由貢獻者自主發起的,官方承認的文檔,由翻譯者進行翻譯貢獻,由 Sanic 官方團隊進行發佈。或許有的小夥伴會說 Flask 也有完善的中文文檔,但是那是在不同的站點上的,Sanic 的所有文檔都有 Sanic 官方進行發佈支持。且目前 Sanic 還在持續支持 韓語、葡萄牙語等更多的語種。

社區指導

和其他框架不同,您或許能夠在百度上找到論壇、頻道等,但這些都是經過本地漢化的,運營者往往並不是官方,且其中夾雜了很多廣告。很顯然,如果是官方運營的不可能允許這種情況出現。

Sanic 不同於其他的社區,所有的論壇、頻道完全由官方運營,在這裏,你可以向核心開發者提問問題,Sanic 的官方發佈經理也非常樂意回答各種問題。你也可以和志同道合的使用者分享自己的使用經驗。這是一個完全開放的環境….

Sanic 目前常用的有 論壇、Discord、github issues、twitter、Stackoverflow

大家可以在以上的方式中關注 Sanic 的發展以及尋求社區幫助。

你還在等什麼?還不趕緊去試一下?最後,以 Sanic 的願景結尾:Build Faster, Run Faster !

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/3cnfTwSj9xyntUd4pr5CEA