<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 8069字,需瀏覽 17分鐘

           ·

          2021-08-16 23:40

          來自:掘金,作者:ConnorZhang
          鏈接:https://juejin.cn/post/6944598601674784775

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

          速度為先

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

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

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

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

          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 ""
          復(fù)制代碼
          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)
          復(fù)制代碼
          # 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),
              ]
          )
          復(fù)制代碼
          # 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)
          復(fù)制代碼

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

          OK,就這么多,說到這里你也應(yīng)該知道我想要說的這個異步框架是誰了,沒錯,我們今天的主角就是 Sanic

          為什么要用異步 Web 框架?

          這可能是眾多小伙伴最先想到的問題了吧?我用 Django、Flask 用的好好的,能夠完成正常的任務(wù),為什么還要用異步 Web 框架呢?

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

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

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

          生態(tài)環(huán)境

          可能有的小伙伴還是會說,你為什么不推薦 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()

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

          而大多數(shù)框架并不具備這樣的生態(tài)環(huán)境,這應(yīng)該也是為什么大多數(shù) Python 的 Web 開發(fā)者愿意選擇 Django 、 Flask 、 tornado 的原因。就是因為它們的生態(tài)相對于其他框架要豐富太多太多。

          可是,如今不一樣了。Sanic 框架, 從 2016 年 5 月開始 發(fā)布了第一版異步 Web 框架雛形,至今已經(jīng)走過了 5 個年頭,這 5 年,經(jīng)過不斷地技術(shù)積累,Sanic 已經(jīng)由一個步履蹣跚的小框架變成了一個健步如飛的穩(wěn)重框架。

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

          生產(chǎn)環(huán)境

          以前我在國內(nèi)的社區(qū)中看到過一些小伙伴在問 2020 年了,Sanic 可以用于生產(chǎn)環(huán)境了嗎?

          答案是肯定的,筆者以親身經(jīng)歷來作證,從19年底,我們就已經(jīng)將 Sanic 用于生產(chǎn)環(huán)境了。彼時的 Sanic 還是 19.9,筆者經(jīng)歷了 Sanic 19.9 -- 21.3 所有的 Sanic 的版本,眼看著 Sanic 的生態(tài)環(huán)境變得越來越棒。

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

          文檔完善

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

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

          社區(qū)指導(dǎo)

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

          Sanic 不同于其他的社區(qū),所有的論壇、頻道完全由官方運營,在這里,你可以向核心開發(fā)者提問問題,Sanic 的官方發(fā)布經(jīng)理也非常樂意回答各種問題。你也可以和志同道合的使用者分享自己的使用經(jīng)驗。這是一個完全開放的環(huán)境….

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

          大家可以在以上的方式中關(guān)注 Sanic 的發(fā)展以及尋求社區(qū)幫助。

          你還在等什么?還不趕緊去試一下?最后,以 Sanic 的愿景結(jié)尾:Build Faster, Run Faster !



          推薦閱讀:

          入門: 最全的零基礎(chǔ)學(xué)Python的問題  | 零基礎(chǔ)學(xué)了8個月的Python  | 實戰(zhàn)項目 |學(xué)Python就是這條捷徑


          干貨:爬取豆瓣短評,電影《后來的我們》 | 38年NBA最佳球員分析 |   從萬眾期待到口碑撲街!唐探3令人失望  | 笑看新倚天屠龍記 | 燈謎答題王 |用Python做個海量小姐姐素描圖 |碟中諜這么火,我用機器學(xué)習(xí)做個迷你推薦系統(tǒng)電影


          趣味:彈球游戲  | 九宮格  | 漂亮的花 | 兩百行Python《天天酷跑》游戲!


          AI: 會做詩的機器人 | 給圖片上色 | 預(yù)測收入 | 碟中諜這么火,我用機器學(xué)習(xí)做個迷你推薦系統(tǒng)電影


          小工具: Pdf轉(zhuǎn)Word,輕松搞定表格和水印! | 一鍵把html網(wǎng)頁保存為pdf!|  再見PDF提取收費! | 用90行代碼打造最強PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換 | 制作一款釘釘?shù)蛢r機票提示器! |60行代碼做了一個語音壁紙切換器天天看小姐姐!


          年度爆款文案


          點閱讀原文,領(lǐng)AI全套資料!

          瀏覽 27
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费一级黃色 | 操逼视频在线观看免费 | 伊人草大香蕉 | 国产乱来╳╳A片视频 | 男人先锋资源网 |