【问题标题】:How to run python scripts with default arguments in FastApi如何在 FastApi 中使用默认参数运行 python 脚本
【发布时间】:2022-08-10 02:26:49
【问题描述】:

我是快速 api 的新手,我需要一些解释

我的代码:

app_code.py:

import json
import argparse


def args():
    parser = argparse.ArgumentParser(\"Some argumets\")
    parser.add_argument(\"--name\", type=str)
    parser.add_argument(\"--surname\", type=str, nargs=\'?\', default=\"Smith\")
    parser.add_argument(\"--birthday\", type=str, nargs=\'?\', default=\"2001\")

    args = parser.parse_args()
    return args


def create_df(name):
    ar = args()
    print(ar)
    x = {\"name\": name, \"surname\": ar.surname, \"bd\": ar.birthday}

    x = json.dumps(x)

    return x


if __name__ == \"__main__\":
    args_all = args()

    print(f\"name: {args_all.name}, surname: {args_all.surname}, birthday:{args_all.birthday}\")
    print(create_df(args_all.name))

main_api.py

from fastapi import FastAPI
from app_code import *

app = FastAPI()


@app.get(\"/names\")
async def root(name: str = \'none\'):
    print(\"In progress...\")
    result = create_df(name)
    return result

当我正常运行它时,我的意思是只运行脚本应用程序:

python app_code.py --name=James

我得到了正确的结果:

{name:James, surname:Smith, bd:2001}

但是当我尝试将其用作 FASTApi 时,当我转到浏览器并尝试运行时,我遇到了参数问题:

api.addres.url/port/name?James

我得到了那个错误:

 File \"P:\\pythonProject3\\api\\.\\app_code.py\", line 16, in create_df
    ar = args()
  File \"P:\\pythonProject3\\api\\.\\app_code.py\", line 11, in args
    args = parser.parse_args()
  File \"C:\\Users\\ubunt\\AppData\\Local\\Programs\\Python\\Python39\\lib\\argparse.py\", line 1821, in parse_args
    self.error(msg % \' \'.join(argv))
  File \"C:\\Users\\ubunt\\AppData\\Local\\Programs\\Python\\Python39\\lib\\argparse.py\", line 2575, in error
    self.exit(2, _(\'%(prog)s: error: %(message)s\\n\') % args)
  File \"C:\\Users\\ubunt\\AppData\\Local\\Programs\\Python\\Python39\\lib\\argparse.py\", line 2562, in exit
    _sys.exit(status)
SystemExit: 2
←[32mINFO←[0m:     127.0.0.1:50671 - \"←[1mGET /names?name=James HTTP/1.1←[0m\" ←[91m500 Internal Server Error←[0m

正如你所看到的,我想要一些默认参数和一些需要输入的参数,比如名称,我对默认参数有疑问。

我的意思是,我知道这是因为我在我的 FastApi 中只使用了脚本中的一种方法(我可以运行整个脚本吗?),这就是我将 ar=args() 放在那里的原因。但它不能解决我的问题。

当我在浏览器中输入时,我只想获取由 create_df() 方法创建的 JSON:

`api.addres.url/port/names?James` or `api.addres.url/port/name?James&?Potter`

有人可以解释我如何修复它吗?

  • 不要调用args - 相反,让您的create_df 函数将这些值作为参数,并在您的__main__ 方法中调用args 而不是CLI 版本,并提供来自网络的值处理 API 请求时的请求。

标签: python fastapi


【解决方案1】:

您可以改为在端点中执行此操作。如果您不设置查询参数的默认值,则它自动表示它是必需的。根据documentation:

当你声明一个默认值对于非路径参数(现在,我们 只见过查询参数),那么这不是必需的.

如果您不想添加特定值,而只是使其成为可选, 将默认设置为没有任何.

但是当你想做一个需要查询参数, 你可以不是 宣布任何默认值:

所以,在你的情况下,你可以有这样的事情:

@app.get("/names")
def root(name: str, surname: str = "Smith", birthday: str = "2001"):
    print("In progress...")
    #result = create_df(name)
    return {"name": name, "surname": surname, "bd": birthday}

在浏览器中,您可以输入,例如:127.0.0.1:8000/names?name=James

【讨论】:

  • 谢谢你@Chris,根据你的建议,我只是将“result = ...”行更改为:result = create_df(name=name, surname=surname,birthday=birthday)
猜你喜欢
  • 1970-01-01
  • 2021-12-03
  • 2019-11-28
  • 2022-01-18
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 2013-02-20
相关资源
最近更新 更多