说到API开发,你可能会想到DjangoRESTFramework、Flask、FastAPI,没错,它们都可以用来写API,但是今天分享的框架可以让你更快地将现有函数转换为API,它是Sanic。Sanic简介Sanic[1],是一个旨在提高性能的Python3.7+网络服务器和网络框架。允许使用Python3.5新增的async/await语法,可以有效避免阻塞,提高响应速度。Sanic致力于提供一种简单快速的方式来创建和启动易于修改和扩展的HTTP服务。Sanic具有开箱即用的功能,可用于编写、部署和扩展生产级Web应用程序。目前,Github拥有16.3k星和广泛的社区支持。它具有以下特点:内置极速web服务器生产就绪高可扩展性支持ASGI简单直观的API设计社区保证如何将现有代码快速转换为API现在让我们看看如何将代码转换为API,如果已经有functions.py中编写的函数:importdatetimedefget_datetime():returndatetime.datetime.now().strftime("%Y-%m-%d%H:%M:%S")defsum_x_y(x,y):returnx+y转成API,再写一个sanic_app.py:fromsanicimportSanic,jsonfromfunctionsimportget_datetime,sum_x_yapp=Sanic("CodeToAPI")HOST="localhost"PORT=8000@app.route("/getdatetime")asyncdefgetdatetime(request):返回json({"now":get_datetime()})@app.get('/sumxy')asyncdefsumxy(request):parameters=request.argsresult=sum_x_y(int(parameters['x'][0]),int(parameters['y'][0]))returnjson({'result':result})if__name__=="__main__":app.run(host=HOST,port=PORT,debug=False)然后,你只需要执行pythonsanic_app.py启动API服务:从运行结果可以知道sanic一直运行在生产环境模式,这一点与其他web框架不同。其他框架带有内置开发服务器,并明确声明它仅用于开发。Sanic的情况正好相反,内置的服务器可以直接在生产环境中使用。可以使用curl进行接口测试:?curl"http://localhost:8000/getdatetime"{"now":"2022-07-2506:34:25"}%?curl"http://localhost:8000/sumxy?x=12&y=34"{"result":46}%如果用post,用json传参,也简单:@app.post('/sumxy')asyncdefsumxy(request):parameters=request.jsonprint(parameters)result=sum_x_y(int(parameters['x']),int(parameters['y']))returnjson({'result':result})curl像这样测试:?curl-X'POST''http://localhost:8000/sumxy'-H"Content-Type:application/json"-d'{"x":10,"y":20}'{"result":30}%deployment除了其他Sanic中的内置服务器(大多数情况下建议用于生产),它还兼容ASGI。这意味着您可以使用您最喜欢的ASGI服务器来运行Sanic。现在主流的ASGI服务器有3种,Daphne、Uvicorn(FastAPI用的就是这个)、Hypercorn。也可以在Gunicorn中部署:gunicornmyapp:app--bind0.0.0.0:1337--worker-classsanic.worker.GunicornWorker静态文件处理,并记录请求访问日志,想获得更好的性能,可以考虑使用Nginx作为代理,让Nginx处理访问日志和静态文件,比Python快很多。
