小编Chr*_*ris的帖子

Pydantic 在具有自定义模型的可选字段上返回“必需字段 (type=value_error.missing)”

我正在尝试在 Fastapi-users pydantic 架构中构建自定义字段,如下所示:

class UserRead(schemas.BaseUser[uuid.UUID]):
    twitter_account: Optional['TwitterAccount']
Run Code Online (Sandbox Code Playgroud)

在 UserRead 验证上 Pydantic 返回

field required (type=value_error.missing)
Run Code Online (Sandbox Code Playgroud)

'TwitterAccount' schema.update_forward_refs()最后调用每个字段。

TwitterAccount本身具有必填字段,并使它们可选并不是可接受的解决方法。我注意到我可以做到Optional[List['TwitterAccount']]并且会起作用,但这有点愚蠢。

python pydantic fastapi fastapiusers

10
推荐指数
1
解决办法
3万
查看次数

FastAPI - 带有 Pydantic 列表字段的 GET 请求

GET我是 FastAPI 的新手(从 Flask 迁移),我正在尝试为我的路线创建一个 Pydantic 模型:

from fastapi import APIRouter,Depends
from pydantic import BaseModel
from typing import Optional,List

router = APIRouter()

class SortModel(BaseModel):
    field:    Optional[str]
    directions: List[str]

@router.get("/pydanticmodel")
def get_sort(criteria: SortModel = Depends(SortModel)):
    pass #my code for handling this route.....
Run Code Online (Sandbox Code Playgroud)

当我跑步时 curl -X GET http://localhost:XXXX/pydanticmodel?directions=up&directions=asc&field=id 我得到422 Unprocessable Entity: {"detail":[{"loc":["body"],"msg":"field required","type":"value_error.missing"}]}

但如果我正在改变directions:List[str]->directions: str我正在200 OK接受directions="asc". str对于查询参数有效而List[str]无效的原因是什么?我究竟做错了什么?

谢谢。

python pydantic fastapi

9
推荐指数
2
解决办法
8652
查看次数

如何设置 FastAPI 版本以允许 HTTP 在接受标头中指定版本?

我正在开发一个需要对 FastAPI 端点进行版本控制的项目。我们希望通过 HTTP 接受标头对端点进行版本控制,例如:

headers={'Accept': 'application/json;version=1.0.1'}, 
headers={'Accept': 'application/json;version=1.0.2'}
Run Code Online (Sandbox Code Playgroud)

像这样设置 api 版本似乎不起作用:

headers={'Accept': 'application/json;version=1.0.1'}, 
headers={'Accept': 'application/json;version=1.0.2'}
Run Code Online (Sandbox Code Playgroud)

有谁知道我还需要做什么?

http api-versioning fastapi

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

FastAPI:如何为 Pydantic 的 Basemodel 中的字段指定可能的值?

我有一个像这样的模型:

# Imports
from pydantic import BaseModel

# Data Models
class MyModel(BaseModel):
    a: str
    b: str
    c: str

@app.post('/endpoint_to_post')
async def post_log(my_model: MyModel):
Run Code Online (Sandbox Code Playgroud)

我想对该模型指定一些约束。事实上,我需要对模型MyModel的字段C进行可能的值约束。

喜欢:

# Imports
from pydantic import BaseModel

# Data Models
class MyModel(BaseModel):
    a: str
    b: str
    c: str in ['possible_value_1', 'possible_value_2']
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助 :)

python pydantic fastapi

9
推荐指数
3
解决办法
1万
查看次数

如何使用 FastAPI 和 Swagger 允许任意查询参数?

注意:这个问题与这里的问题不同,因为我需要它与 Swagger 一起工作。

给定一个 FastAPIGET端点,我希望允许任意一组 URL 参数,同时保持 Swagger 支持。

我的用例是我想要支持一组类似于 JSON API 的查询参数,如下所示:

/api/books/?include=author&sort=name,zip&sort[author]=-lname&fields=name,phone,street
Run Code Online (Sandbox Code Playgroud)

使用方括号使我无法使用传统的类来对查询参数进行建模,因此我直接使用该Request对象。但是,我想使用 Swagger 来测试端点。我找不到提供任意 URL 参数的方法。我很高兴将它们作为单个字符串输入。

人们可能会这样想:

def books(**params): 
    ....
Run Code Online (Sandbox Code Playgroud)

这给出了一个curl语句:

api/books?params=sort%5Bone%5D%3Dtwo'
Run Code Online (Sandbox Code Playgroud)

我真正想要的是:

api/books?sort&one%5D%3Dtwo'
Run Code Online (Sandbox Code Playgroud)

python swagger fastapi

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

如何使 FastAPI 服务器可从本地网络外部访问?

我第一次使用 FastAPI 开发一个小型 API。我用来uvicorn运行该应用程序。

当我使用时:

$ uvicorn main:app --host 0.0.0.0
Run Code Online (Sandbox Code Playgroud)

我可以从网络内部(使用我的公共 IP)访问该应用程序,但不能从外部访问该应用程序。我已经检查了防火墙,甚至尝试完全禁用它,但是没有任何效果。我只是希望能够向外界展示该应用程序。我怎样才能做到这一点?

networking fastapi

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

如何使用 FastAPI 从 HTTP 请求中获取 cookie?

当有人点击 API 时是否可以获取 cookie?我需要读取每个请求的cookie。

@app.get("/")
async def root(text: str, sessionKey: str = Header(None)):
    print(sessionKey)
    return {"message": text+" returned"}

if __name__ == "__main__":
    uvicorn.run("main:app", host="0.0.0.0", port=5001 ,reload=True)
Run Code Online (Sandbox Code Playgroud)

python cookies http starlette fastapi

9
推荐指数
2
解决办法
9670
查看次数

如何获取具有不同结构和不同字段的 JSON 格式的 FastAPI 应用程序控制台日志?

我有一个 FastAPI 应用程序,我希望将默认日志写入 STDOUT,并使用 JSON 格式的以下数据:

应用程序日志应如下所示:

{
 "XYZ": {
   "log": {
     "level": "info",
     "type": "app",
     "timestamp": "2022-01-16T08:30:08.181Z",
     "file": "api/predictor/predict.py",
     "line": 34,
     "threadId": 435454,
     "message": "API Server started on port 8080 (development)"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

访问日志应如下所示:

{
 "XYZ": {
   "log": {
     "level": "info",
     "type": "access",
     "timestamp": "2022-01-16T08:30:08.181Z",
     "message": "GET /app/health 200 6ms"
   },
   "req": {
     "url": "/app/health",
     "headers": {
       "host": "localhost:8080",
       "user-agent": "curl/7.68.0",
       "accept": "*/*"
     },
     "method": "GET",
     "httpVersion": "1.1",
     "originalUrl": "/app/health",
     "query": {}
   },
   "res": {
     "statusCode": 200,
     "body": …
Run Code Online (Sandbox Code Playgroud)

python logging gunicorn fastapi uvicorn

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

OpenAPI 缺少 FastAPI 应用程序中某些 Pydantic 模型的架构

我正在构建一个 FastAPI 应用程序,其中有很多 Pydantic 模型。尽管应用程序运行良好,但正如预期的那样,OpenAPI (Swagger UI) 文档并未在该Schemas部分下显示所有这些模型的架构。

这是pydantic的内容schemas.py

import socket
from datetime import datetime
from enum import Enum
from typing import Any, Dict, List, Optional, Set, Union

from pydantic import BaseModel, Field, validator
from typing_extensions import Literal

ResponseData = Union[List[Any], Dict[str, Any], BaseModel]


# Not visible in Swagger UI
class PageIn(BaseModel):
    page_size: int = Field(default=100, gt=0)
    num_pages: int = Field(default=1, gt=0, exclude=True)
    start_page: int = Field(default=1, gt=0, exclude=True)

# visible under schemas on Swagger UI
class …
Run Code Online (Sandbox Code Playgroud)

python swagger openapi pydantic fastapi

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

如何在 FastAPI Swagger 自动文档中为 API 方法创建自定义排序顺序?

如何在FastAPI Swagger autodocs中为 API 方法设置自定义排序顺序?

这个问题展示了如何在 Java 中做到这一点。我之前的问题询问如何按“方法”排序,这是受支持的排序方法。我真的很想更进一步,以便我可以确定方法出现的顺序。现在DELETE显示在顶部,但我希望 API 方法的顺序为:GET, POST, PUT, DELETE

我知道可以在 JavaScript 中实现自定义排序并将该函数提供给operationsSorter,但您不能从swagger_ui_parametersPython 绑定中可用的属性中包含它。有什么方法可以在Python中完成这个任务吗?

from fastapi import FastAPI

app = FastAPI(swagger_ui_parameters={"operationsSorter": "method"})

@app.get("/")
def list_all_components():
    pass

@app.get("/{component_id}")
def get_component(component_id: int):
    pass

@app.post("/")
def create_component():
    pass

@app.put("/{component_id}")
def update_component(component_id: int):
    pass

@app.delete("/{component_id}")
def delete_component(component_id: int):
    pass
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

python swagger swagger-ui openapi fastapi

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