ITPub博客

首页 > 数据库 > 数据库开发技术 > fastapi框架系列-异步函数转换普通函数

fastapi框架系列-异步函数转换普通函数

原创 数据库开发技术 作者:程序员小钟同学 时间:2022-04-21 10:15:35 0 删除 编辑

问题描述:在同步中调用异步

该根据某网友的疑问来解决。

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转换包

通过asgiref可以把异步或同步函数进行相互的转换。

  • AsyncToSync把异步转同步 :就是在异步函数(协程函数)转换普通的函数,方便在同步线程函数中调用
  • SynctoAsync把同步转异步:就是把一个同线程调用函数使用线程的模式转换为多线程的调用并包装为一个(协程函数)返回

实际应用


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


原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111688