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

blank

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

來自:掘金,作者:ConnorZhang連結:juejin.cn/post/69445986
版權歸作者所有! 侵刪!!!

文章為轉載的! 大家可以試試! 我也是本著試試的心態! 想分享這篇文章給大家一起試試!

我百戰程式師學的Python課,老師讓我們多做練習! 所以我經常收藏一些我看起來有用的帖子,然後自己課後練習一下! 聽完課在練習練習題,事半功倍!

blank

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

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

blank

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

blank

這是所有的 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 框架呢?

blank

說到這裡,首先我要反問你你一個問題,你認為在 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 Kantnn')

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 的原因。 就是因為它們的生態相對於其他框架要豐富太多太多。

blank

可是,如今不一樣了。 Sanic 框架, 從 2016 年 5 月開始 發佈了第一版異步 Web 框架雛形,至今已經走過了 5 個年頭,這 5 年,經過不斷地技術積累,Sanic 已經由一個步履蹣跚的小框架變成了一個健步如飛的穩重框架。
在 awesome-sanic 專案中,記錄了大量的第三方庫,你可以找到任何常用的工具:從 API 到 Authentication,從 Development 到 Frontend,從 Monitoring 到 ORM,從 Caching 到 Queue... 只有你想不到的,沒有它沒有的第三方拓展。
生產環境
以前我在國內的社區中看到過一些小夥伴在問 2020 年了,Sanic 可以用於生產環境了嗎?

blank

答案是肯定的,筆者以親身經歷來作證,從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 還在持續支援 韓語、葡萄牙語等更多的語種。

blank

社區指導
和其他框架不同,您或許能夠在百度上找到論壇、頻道等,但這些都是經過本地漢化的,運營者往往並不是官方,且其中夾雜了很多廣告。 很顯然,如果是官方運營的不可能允許這種情況出現。
Sanic 不同於其他的社區,所有的論壇、頻道完全由官方運營,在這裡,你可以向核心開發者提問問題,Sanic 的官方發佈經理也非常樂意回答各種問題。 你也可以和志同道合的消費者分享自己的使用經驗。 這是一個完全開放的環境....
Sanic 目前常用的有 論壇、Discord、github issues、twitter、Stackoverflow

blank

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

blank

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

--- EOF ---


blank

What do you think?

Written by marketer

blank

逆冬:分享3大SEO經驗、排名好的唯一方法是實戰

blank

Django入門,學會這些就夠了!