【问题标题】:How can I run the fast-api server using Pycharm?如何使用 Pycharm 运行 fast-api 服务器?
【发布时间】:2020-11-01 12:36:20
【问题描述】:

我有一个简单的API函数如下,

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}

我正在使用 uvicorn 命令启动服务器,

uvicorn main:app

由于我们没有直接调用任何python文件,所以无法从Pycharm调用uvicorn命令。

那么,如何使用 Pycharm 运行 fast-api 服务器?

【问题讨论】:

    标签: python pycharm fastapi


    【解决方案1】:

    方法一:调用uvicorn.run(...)运行FastAPI

    在这种情况下,您的最小代码如下,

    # main.py
    
    import uvicorn
    from fastapi import FastAPI
    
    app = FastAPI()
    
    
    @app.get("/")
    async def read_root():
        return {"Hello": "World"}
    
    
    if __name__ == "__main__":
        uvicorn.run(app, host="0.0.0.0", port=8000)

    通常,您将通过运行以下命令来启动服务器,

    python main.py
    

    Pycharm 设置

    对于这个设置,现在,您可以在 Pycharm 的配置中设置脚本路径

    注意事项

    • 脚本路径:FastAPI 脚本的路径
    • Python 解释器:选择您的解释器/虚拟环境
    • 工作目录:您的 FastAPI 项目根目录

    方法二:调用uvicorn命令运行FastAPI

    在这种情况下,您的最小代码如下,

    # main.py
    
    from fastapi import FastAPI
    
    app = FastAPI()
    
    
    @app.get("/")
    async def read_root():
        return {"Hello": "World"}

    通常,您将通过运行以下命令来启动服务器,

    uvicorn main:app --reload
    

    Pycharm 设置

    对于这个设置,现在,您可以在 Pycharm 的配置中设置脚本路径

    注意事项

    • 模块名称:设置为uvicorn
    • [可选] 脚本:uvicorn 二进制文件的路径。您将通过在您的环境中执行命令 which uvicorn 来获取路径。 (See this image)
    • 参数:uvicorn命令的实际参数
    • Python 解释器:选择您的解释器/虚拟环境
    • 工作目录:您的 FastAPI 项目根目录

    【讨论】:

    • 问题是你不能以这种方式部署到生产中,因为你不能真正将其他参数传递给 uvicorn...比如“workers”等。至少我无法得到它工作。
    • 另外,这不适用于生产。假设如果你想更新工人的数量,你需要更新你的代码,这当然不是一个好主意。这就是 unicorn 支持命令行设置的原因。
    • 顺便说一句,uvicorn.run(...) 支持命令行支持的所有参数
    • 可以通过pycharm传入args,通过config = Config(app, **kwargs)动态配置uvicorn支持的所有args
    • 您能解释一下为什么这很重要吗?抱歉,我没有明白你的意思@TimothyMugayi
    【解决方案2】:

    你可以在main.py中不添加代码

    1. target to run 而不是Script path 中选择Module name
    2. Module name 中输入uvicorn
    3. 在参数app.main:app --reload --port 5000

    【讨论】:

    • 太棒了,在其他任何地方都找不到关于如何同时调试和重新加载的答案
    • 这是我认为最好的答案,因为它是唯一一个可以让您使用--reload
    【解决方案3】:

    尝试在您的代码中调用 uvicorn。例如:

    from fastapi import FastAPI
    import uvicorn
    
    app = FastAPI()
    
    
    @app.get("/")
    async def read_root():
        return {"Hello": "World"}
    
    if __name__ == "__main__":
        uvicorn.run(app, host="0.0.0.0", port=5000, log_level="info")
    

    Reference

    【讨论】:

      【解决方案4】:

      另一个例子,这可能对某人有帮助。

      # fastapi_demo.py
      
      import uvicorn
      from fastapi import FastAPI, Response
      
      app = FastAPI()
      
      @app.route('/', methods=['POST'])
      def demo(request):
          try:
              print(request)
          except Exception as e:
              print(e)
          return Response(content='OK')
      
      
      if __name__ == '__main__':
          uvicorn.run(app='fastapi_demo:app')
      

      【讨论】:

      • 这会导致 fastapi_demo 运行两次。如果你有一个(例如)全局变量,它将被初始化
      • 谢谢@Coco 指出我的错误。由于配置错误,它运行了两次。实际上,我已经添加了reload=True,它会导致双重初始化。为避免这种情况,您必须添加 reload_dirs=['/app_dir_name',]。但是,这种方法通过 PyCharm 运行应用程序并没有错。 Check this仅供参考
      • 你需要运行uvicorn.run(app),这不会启动应用程序两次
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      相关资源
      最近更新 更多