社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何快速把你的 Python 代码变为 API

Python编程时光 • 2 年前 • 372 次点击  
提到 API 开发,你可能会想到 Django REST Framework,Flask,FastAPI,没错,它们完全可以用来编写 API,不过,今天分享的这个框架可以让你更快把现有的函数转化为 API,它就是 Sanic。

# Sanic 简介

Sanic[1],是 Python3.7+ Web 服务器和 Web 框架,旨在提高性能。它允许使用 Python3.5 中添加的 async/await 语法,这可以有效避免阻塞从而达到提升响应速度的目的。Sanic致力于提供一种简单且快速,集创建和启动于一体的方法,来实现一个易于修改和拓展的 HTTP 服务,Sanic 具备开箱即用的功能,它可以用于编写,部署和扩展生产级 Web 应用程序。目前 Github 有 16.3k 的星,有广泛的社区支持。

有以下特性:

  • 内置极速 web server

  • 生产准备就绪

  • 极高的拓展性

  • 支持 ASGI

  • 简单直观的 API 设计

  • 社区保障

# 如何将现有代码快速转化为 API

现在让我们看,如何将代码转为 API,假如有已经在 functions.py 写好的两个函数:

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

转化为 API 只需再编写一个 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)

然后,只需要执行 python sanic_app.py 就可以启动 API 服务:

从运行结果可以得知,sanic 已经运行在生产环境模式,这与其他 Web 框架不同,其他框架带有一个内置的开发服务器,并明确表示它只用于开发。而 Sanic 的情况恰好相反,内置的服务器可以直接用于生产环境。

可以用 curl 进行接口测试:

❯ 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 传参,也是简单的:

@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 这样测试:

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

# 部署在其他

Sanic 除了自带的服务器(大多数情况推荐自带的服务器用于生产),同样兼容 ASGI。这意味着您可以使用你喜欢的 ASGI 服务器来运行 Sanic。现在有三大主流的 ASGI 服务器, Daphne、Uvicorn (FastAPI 用的就是这个)、Hypercorn。

也可以部署在 Gunicorn:

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

静态文件的处理,及记录请求访问日志,又想获得更好的性能,可以考虑使用 Nginx 作为代理,让 Nginx 来处理访问日志和静态文件,这种方式要比用 Python 处理快得多得多。

# 最后的话

本文分享了下一代的 Python Web 框架 Sanic,直接支持异步,且内置生产级别的 Web 服务器,可以说是编写 API 相当快的工具了,如果有帮助,还请点赞、在看、转发






Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/146498
 
372 次点击