首页 > 数据库 > 数据库开发技术 > fastapi框架系列-异步函数转换普通函数
该根据某网友的疑问来解决。
fastapi框架是一个混搭的框架,如果你需要在同步中调用协程函数需要做想跟的转换。比如:你需要的多线程的模式下读取对应提交过来的body的时候。由于本身Fastapi提供的reques.body()是一个协程函数,也就是需要使用awite reques.body()所以就遇到转换问题。
@app.post("/get/access_token")
def access_token(reques:Request,name=Body(...)):
print(reques.body())
await reques.body()
return 'pk'
在上面中await reques.body()明显是会错,在普通函数里面嵌套使用await调用携程函数是不可以。所以我们需要进行转换。问题解决,引入django中提供一个关于转换包asgiref。这个包独立的,他可以独立安装。框架安装的时候本身其实就默认的自带安装asgiref。
通过asgiref可以把异步或同步函数进行相互的转换。
from fastapi import FastAPI,Request
from fastapi.responses import PlainTextResponse
from fastapi.params import Body
from fastapi.background import BackgroundTasks
# 定义我们的APP服务对象
app = FastAPI()
@app.post("/get/access_token")
def access_token(reques:Request,name=Body(...)):
# print(reques.body())
from asgiref.sync import async_to_sync
body = async_to_sync(reques.body)()
print(body)
return PlainTextResponse(body.decode(encoding='utf-8'))
if __name__ == '__main__':
import uvicorn
uvicorn.run('kkk:app', host="127.0.0.1", port=8100, debug=True, reload=True)
上述代码中,需要注意的是:async_to_sync需要传入的是一个awaitable,返回是一个函数,所以我们的还需要在函数的后面进行()进行一个函数的调用处理。最终如下图所示结果:
以上仅仅是个人结合自己的实际需求,做学习的实践笔记!如有笔误!欢迎批评指正!感谢各位大佬!
END
简书:https://www.jianshu.com/u/d6960089b087
掘金:https://juejin.cn/user/2963939079225608
公众号:微信搜【程序员小钟同学】
小钟同学 | 文 【欢迎一起学习交流】| QQ:308711822
原文作者:程序员小钟同学;如有侵权,请联系管理员删除。