通过 FAST API 传递对象参数

Pass object argument through FAST API

我对 FAST API 有疑问,因为我无法理解某些内容,而且文档对我来说也不清楚。

我有示例程序:

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="Dan")
    parser.add_argument("--birthday", type=str, nargs='?', default="1995")

    args = parser.parse_args()
    return args


class Simple():


    def create_df(self, name, surname, birthday):

        x = {"name": name, "surname": surname, "bd": birthday}

        x = json.dumps(x)

        return x


if __name__ == "__main__":
    args_all = args()
    s = Simple()
    print(f"name: {args_all.name}, surname: {args_all.surname}, birthday:{args_all.birthday}")
    print(s.create_df(args_all.name, args_all.surname, args_all.birthday))

我可以 运行 通过:

python app.py --name=Matt --surname=Dan  #And let's say that birthday is 1995 is default one.

并获得工作字符串 Matt Dan 1995

现在我希望通过 FAST API 向用户公开它。它可以创建如下请求:

www.api_adress.domain/names?name=Anthony&birthday=33

预期结果:运行 带参数的函数:

name=Anthony, surname=Dan, birthday=33

如您所见,我需要一些默认值,但可以由用户更改。

我的api_code:

from fastapi import FastAPI
from app_code import *

app = FastAPI()

o = Simple()
args = args()

name = args.name
surname = args.surname
birthday = args.birthday

print(args)

@app.get("/names")
async def root(name=args.name, surname=args.surname, birthday = birthday.args.birthday):
    print("In progress...")
    result = Simple.create_df(name=name, surname=surname, birthday=birthday)
    return result

当然我尝试了很多配置(并且仍在寻找解决方案),但仍然出现如下错误:

←[33mWARNING←[0m:  The --reload flag should not be used in production on Windows.
usage: Some argumets [-h] [--name NAME] [--surname [SURNAME]] [--birthday [BIRTHDAY]]
Some argumets: error: unrecognized arguments: main_api:app --reload

我在理解和尝试解决问题时遇到了一些问题。如何像普通程序一样传递一些默认值的参数?所以如果有人能给我解释一下,我将不胜感激!

::::编辑::::

我把API改成了:

@app.get("/names")
async def root(name: str, surname: str = "Dan", birthday: str = "2020"):
    print("In progress...")
    result = Simple.create_df(name=name, surname=surname, birthday=birthday)
    return result

现在我得到错误:

←[32mINFO←[0m:     Uvicorn running on ←[1mhttp://127.0.0.1:8000←[0m (Press CTRL+C to quit)
←[32mINFO←[0m:     Started reloader process [←[36m←[1m20260←[0m] using ←[36m←[1mwatchgod←[0m
←[33mWARNING←[0m:  The --reload flag should not be used in production on Windows.
usage: Some argumets [-h] [--name NAME] [--surname [SURNAME]] [--birthday [BIRTHDAY]]
Some argumets: error: unrecognized arguments: main_api:app --reload

:::::EDIT2 --- 可行的解决方案! ::::

我的 api.py python 文件工作正常。感谢评论。

from fastapi import FastAPI
from app_code import *
from pydantic import *

app = FastAPI()

o = Simple()


@app.get("/names")
async def root(name: str, surname: str = "Dan", birthday: str = "2020"):
    print("In progress...")
    result = o.create_df(name=name, surname=surname, birthday=birthday)
    return result

感谢 MatsLindh 的回答我更改了我的 api 代码,一切都按照建议进行。有问题的解决方案 - EDIT2

部分