<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 代碼變?yōu)?API

          共 3259字,需瀏覽 7分鐘

           ·

          2022-08-29 10:59


          提到 API 開發(fā),你可能會(huì)想到 Django REST Framework,F(xiàn)lask,F(xiàn)astAPI,沒錯(cuò),它們完全可以用來編寫 API,不過,今天分享的這個(gè)框架可以讓你更快把現(xiàn)有的函數(shù)轉(zhuǎn)化為 API,它就是 Sanic。

          Sanic 簡(jiǎn)介

          Sanic[1],是 Python3.7+ Web 服務(wù)器和 Web 框架,旨在提高性能。它允許使用 Python3.5 中添加的 async/await 語法,這可以有效避免阻塞從而達(dá)到提升響應(yīng)速度的目的。Sanic致力于提供一種簡(jiǎn)單且快速,集創(chuàng)建和啟動(dòng)于一體的方法,來實(shí)現(xiàn)一個(gè)易于修改和拓展的 HTTP 服務(wù),Sanic 具備開箱即用的功能,它可以用于編寫,部署和擴(kuò)展生產(chǎn)級(jí) Web 應(yīng)用程序。目前 Github 有 16.3k 的星,有廣泛的社區(qū)支持。

          有以下特性:

          • 內(nèi)置極速 web server
          • 生產(chǎn)準(zhǔn)備就緒
          • 極高的拓展性
          • 支持 ASGI
          • 簡(jiǎn)單直觀的 API 設(shè)計(jì)
          • 社區(qū)保障

          如何將現(xiàn)有代碼快速轉(zhuǎn)化為 API

          現(xiàn)在讓我們看,如何將代碼轉(zhuǎn)為 API,假如有已經(jīng)在 functions.py 寫好的兩個(gè)函數(shù):

          import datetime


          def get_datetime():
              return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")


          def sum_x_y(x, y):
              return x + y

          轉(zhuǎn)化為 API 只需再編寫一個(gè) sanic_app.py :

          from sanic import Sanic, json
          from functions import get_datetime, sum_x_y

          app = Sanic("CodeToAPI")
          HOST = "localhost"
          PORT = 8000

          @app.route("/getdatetime")
          async def getdatetime(request):
              return json({"now": get_datetime()})

          @app.get('/sumxy')
          async def sumxy(request):
              parameters = request.args
              result = sum_x_y(int(parameters['x'][0]), int(parameters['y'][0]))
              return json({'result': result})


          if __name__ == "__main__":
              app.run(host=HOST, port=PORT, debug=False)

          然后,只需要執(zhí)行 python sanic_app.py 就可以啟動(dòng) API 服務(wù):

          從運(yùn)行結(jié)果可以得知,sanic 已經(jīng)運(yùn)行在生產(chǎn)環(huán)境模式,這與其他 Web 框架不同,其他框架帶有一個(gè)內(nèi)置的開發(fā)服務(wù)器,并明確表示它只用于開發(fā)。而 Sanic 的情況恰好相反,內(nèi)置的服務(wù)器可以直接用于生產(chǎn)環(huán)境。

          可以用 curl 進(jìn)行接口測(cè)試:

          ? curl "http://localhost:8000/getdatetime"
          {"now":"2022-07-25 06:34:25"}%                                                  ? curl "http://localhost:8000/sumxy?x=12&y=34"
          {"result":46}%

          如果用 post,且使用 json 傳參,也是簡(jiǎn)單的:

          @app.post('/sumxy')
          async def sumxy(request):
              parameters = request.json
              print(parameters)
              result = sum_x_y(int(parameters['x']), int(parameters['y']))
              return json({'result': result})

          curl 這樣測(cè)試:

          ? curl -X 'POST' 'http://localhost:8000/sumxy' -H "Content-Type: application/json" -d '{"x":10,"y":20}'
          {"result":30}%

          部署在其他

          Sanic 除了自帶的服務(wù)器(大多數(shù)情況推薦自帶的服務(wù)器用于生產(chǎn)),同樣兼容 ASGI。這意味著您可以使用你喜歡的 ASGI 服務(wù)器來運(yùn)行 Sanic。現(xiàn)在有三大主流的 ASGI 服務(wù)器, Daphne、Uvicorn (FastAPI 用的就是這個(gè))、Hypercorn。

          也可以部署在 Gunicorn:

          gunicorn myapp:app --bind 0.0.0.0:1337 --worker-class sanic.worker.GunicornWorker

          靜態(tài)文件的處理,及記錄請(qǐng)求訪問日志,又想獲得更好的性能,可以考慮使用 Nginx 作為代理,讓 Nginx 來處理訪問日志和靜態(tài)文件,這種方式要比用 Python 處理快得多得多。

          最后的話

          本文分享了下一代的 Python Web 框架 Sanic,直接支持異步,且內(nèi)置生產(chǎn)級(jí)別的 Web 服務(wù)器,可以說是編寫 API 相當(dāng)快的工具了,如果有幫助,還請(qǐng)點(diǎn)贊、在看、轉(zhuǎn)發(fā)。

          參考資料

          [1]

          Sanic: https://github.com/sanic-org/sanic


          END

          1、為什么不建議用 from xxx import *
          2、2022 年 Python “十級(jí)”試題(全國(guó)卷A)-答案解析
          3、13 個(gè)非常有用的 Python 代碼片段,建議收藏!
          4、推薦 GitHub 上的一套公開 API 接口,簡(jiǎn)直不要太全!
          5、一首歌曲竟然導(dǎo)致WinXP崩潰?時(shí)隔近20年獲得CVE官方漏洞編號(hào)

          點(diǎn)擊關(guān)注公眾號(hào),閱讀更多精彩內(nèi)容

          瀏覽 36
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  怡红院妓院| 亚洲va视频 | 天天日天天操天天射 | 欧美男人天堂 | 色婷婷中文在线 |