如何在 FastApi 中使用默认参数 运行 python 脚本
How to run python scripts with default arguments in FastApi
我是 fast 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`
谁能告诉我如何修复它?
您可以改为在端点中执行此操作。如果您没有设置查询参数的默认值,那么它自动意味着它是必需的。根据 documentation:
When you declare a default value for non-path parameters (for now, we
have only seen query parameters), then it is not required.
If you don't want to add a specific value but just make it optional,
set the default as None.
But when you want to make a query parameter required, you can just not
declare any default value:
所以,在你的情况下你可以有这样的东西:
@app.get("/names")
async 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
我是 fast 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`
谁能告诉我如何修复它?
您可以改为在端点中执行此操作。如果您没有设置查询参数的默认值,那么它自动意味着它是必需的。根据 documentation:
When you declare a default value for non-path parameters (for now, we have only seen query parameters), then it is not required.
If you don't want to add a specific value but just make it optional, set the default as None.
But when you want to make a query parameter required, you can just not declare any default value:
所以,在你的情况下你可以有这样的东西:
@app.get("/names")
async 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