标签: fastapi

Pydantic:根据需要指定值但输入示例值

我在 FastAPI 中使用 Pydantic,在 OpenAPI 文档中定义。意识到要根据需要定义值,我需要将值保留为空,如下所示。

class Item(BaseModel):
    name: str
    description: str
    price: float
    tax: float
Run Code Online (Sandbox Code Playgroud)

但是,我想提供带有示例值的 JSON,我可以使用以下语法创建它。

class Item(BaseModel):
    name: str = "my name"
    description: str = "my description"
    price: float = 0.234
    tax: float = 0.20
Run Code Online (Sandbox Code Playgroud)

但这将使它们成为 OpenAPI 文档中不需要的。有没有什么方法可以让我根据需要指定它们,并给出示例值?

python-3.x pydantic fastapi

1
推荐指数
1
解决办法
2675
查看次数

在FastAPI post请求中上传图片导致400 Bad Request

我想通过发布请求获取图像,然后阅读它。我正在尝试这样做:

import numpy as np
from PIL import Image
from fastapi import FastAPI, File, UploadFile, HTTPException, Depends
app = FastAPI()
@app.post("/predict_image")
    @logger.catch
    def predict_image(predict_image: UploadFile = File(...)):
        logger.info('predict_image POST request performed')
        try:
            pil_image = np.array(Image.open(predict_image.file))
        except:
            raise HTTPException(
                status_code=HTTP_422_UNPROCESSABLE_ENTITY, detail="Unable to process file"
            )
        pred = pil_image.shape
        logger.info('predict_image POST request performed, shape {}'.format(pred))
    return {'input_shape': pred}
Run Code Online (Sandbox Code Playgroud)

调用post请求返回INFO: 127.0.0.1:59364 - "POST /predict_image HTTP/1.1" 400 Bad Request

在此输入图像描述

如何修复它?

更新:

官方教程中的示例返回相同的异常:

@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
    return {"filename": file.filename}
Run Code Online (Sandbox Code Playgroud)

post file-upload image fastapi

1
推荐指数
1
解决办法
3851
查看次数

Python - 在 asyncio 中运行函数的正确方法是什么?

我正在使用 FastApi 并且有一个端点。

我有两个长时间运行的函数,我想使用 asyncio 同时运行

因此,我创建了两个函数:

async def get_data_one():
    return 'done_one'

async def get_data_two():
    return 'done_two'
Run Code Online (Sandbox Code Playgroud)

这些函数从外部 Web 服务获取数据。

我想同时执行它们,所以我创建了另一个函数来执行它:

async def get_data():
    loop = asyncio.get_event_loop()
    asyncio.set_event_loop(loop)
    task_1 = loop.create_task(get_data_one)
    task_2 = loop.create_task(get_data_two)
    tasks = (task_1, task_2)
    first, second = loop.run_until_complete(asyncio.gather(*tasks))
    loop.close()

    # I will then perform cpu intensive computation on the results
    # for now - assume i am just concatenating the results
    return first + second
Run Code Online (Sandbox Code Playgroud)

最后,我有我的终点:

@app.post("/result")
async def get_result_async():
    r = await get_data()

    return r …
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-asyncio fastapi

1
推荐指数
1
解决办法
3107
查看次数

我可以在同一个具有 Api 的 FastApi 中提供角度应用程序吗?

我有一个在 FastApi 框架中开发的 Api。\n我有一个调用 FastApi 的 Angular 应用程序。\n由于多种原因,如果我可以在FastApi 作为一个简单的 Web 应用程序。这样我就可以作为“localhost”访问 Api,并且 Api 可以是“私有”的。

\n

这可能吗?

\n

谢谢你,\n乔斯\xc3\xa9 克鲁兹

\n

angular fastapi

1
推荐指数
1
解决办法
4499
查看次数

FastAPI - 如何在响应中使用 HTTPException?

该文档建议引发带有客户端错误的 HTTPException,这很好。但是如何在文档中按照 HTTPException 的模型显示这些特定错误?意思是带有“详细信息”键的字典。

以下不起作用,因为 HTTPException 不是 Pydantic 模型。

@app.get(
    '/test', 
    responses={
        409 : {
            'model' : HTTPException, 
            'description': 'This endpoint always raises an error'
        }
    }
)
def raises_error():
    raise HTTPException(409, detail='Error raised')
Run Code Online (Sandbox Code Playgroud)

python starlette fastapi

1
推荐指数
1
解决办法
3480
查看次数

地址已被使用 - FastAPI

我一直收到[Errno 98] Address already in use但是地址没有被使用。我试图更改 ip 和端口,但它没有改变。


from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def main():
return {"message": "Helloworld?FastAPI"}


if __name__ == '__main__':
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8000)


Run Code Online (Sandbox Code Playgroud)

uvicorn main:app --reload 也试过了,uvicorn main:app --host=172.0.0.2 --port=5000 它让 [Errno 99] error while attempting to bind on address ('172.0.0.2', 5000): cannot assign requested address 我尝试运行一个烧瓶开发服务器,它也在 172.0.0.1 上运行没有问题?

使用 Arch-Manjaro-Linux

我用 nmap 看看有什么大惊小怪的。

但是127.0.0.1 IP上只有 2 个端口在使用

PORT     STATE SERVICE
631/tcp  open  ipp
8000/tcp open  http-alt
Run Code Online (Sandbox Code Playgroud)

我会使用另一个 …

python linux ip port fastapi

1
推荐指数
1
解决办法
1797
查看次数

当 uvicorn 工作人员> 1 时,uvicorn 和 fastAPI 与 pyinstaller 问题

我检查了 PyInstaller 和 FastAPI(超出最大递归深度)并且 Pyinstaller 编译的 Uvicorn 服务器无法正确启动

FastAPI 演示main.py

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
    return {"hello": "world"}

if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=58000, reload=False)
Run Code Online (Sandbox Code Playgroud)

首先运行 pyinstallerpyinstaller -F main.py --clean并添加hidden_imports规范:

hidden_imports=[
                'uvicorn.logging',
                'uvicorn.loops',
                'uvicorn.loops.auto',
                'uvicorn.protocols',
                'uvicorn.protocols.http',
                'uvicorn.protocols.http.auto',
                'uvicorn.protocols.websockets',
                'uvicorn.protocols.websockets.auto',
                'uvicorn.lifespan',
                'uvicorn.lifespan.on',
            ]
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但是当工人大于 1 时,应用程序必须是字符串:

WARNING: You must pass the application as an import string to enable 'reload' or 'workers'.

所以我改为:

if __name__ == '__main__': …
Run Code Online (Sandbox Code Playgroud)

python pyinstaller fastapi uvicorn

1
推荐指数
1
解决办法
6976
查看次数

在类中运行 fastapi

import uvicorn
from fastapi import FastAPI

# 2. Create the app object
app = FastAPI()

# 3. Index route, opens automatically on http://127.0.0.1:8000
class RunModel():
    @app.get('/')
    def index(self):
        return {'message': 'Hello'}

    @app.get('/predict')
    def get_res(self, feat1: float, feat2:float):
        res = feat1 + feat2
        return {'result': f'{res:.4f}'}

run_model = RunModel()
# 5. Run the API with uvicorn
#    Will run on http://127.0.0.1:8000
if __name__ == '__main__':
    uvicorn.run(app, host='127.0.0.1', port=8000)
Run Code Online (Sandbox Code Playgroud)

当我首先运行它时,我收到错误(在终端而不是浏览器中)422 Unprocessable Entity。接下来的事情是,当我访问 http://localhost:8000/docs 时,它似乎期望我输入 3 个/predict路由值,即预期的两个功能和 self …

python fastapi

1
推荐指数
2
解决办法
6566
查看次数

更改另一个字段时如何修改pydantic字段?

我有一个 pydantic 类,例如:

from pydantic import BaseModel
class Programmer(BaseModel):
    python_skill: float
    stackoverflow_skill: float
    total_score: float = None
Run Code Online (Sandbox Code Playgroud)

现在我正在根据其他字段计算 total_score:

@validator("total_score", always=True)
def calculat_total_score(cls, v, *, values):
    return values.get("python_skill") + values.get("stackoverflow_skill")
Run Code Online (Sandbox Code Playgroud)

这很好用,但是现在当我更改其中一项技能时:

programmer = Programmer(python_skill=1.0, stackoverflow_skill=9.0)
print(programmer.total_score) # return 10.0
programmer.python_skill=2.0 
print(programmer.total_score) # still return 10.0
Run Code Online (Sandbox Code Playgroud)

我希望 total_score 自动更新。

任何解决方案?TNX!!

python validation decorator pydantic fastapi

1
推荐指数
1
解决办法
742
查看次数

Pydantic 字段 JSON 别名根本不起作用

我需要为 Pydantic 对象指定一个 JSON 别名。它根本不起作用。

from pydantic import Field
from pydantic.main import BaseModel


class ComplexObject(BaseModel):
    for0: str = Field(None, alias="for")


def create(x: int, y: int):
    print("was here")
    co = ComplexObject(for0=str(x * y))
    return co


co = create(x=1, y=2)
print(co.json(by_alias=True))
Run Code Online (Sandbox Code Playgroud)

这个的输出是{"for" : null而不是{"for" : "2"}

这是真的吗?这样一个简单的用例怎么可能不起作用?

python pydantic fastapi

1
推荐指数
1
解决办法
437
查看次数