标签: fastapi

TypeError:类型“type”的对象不可 JSON 序列化

该代码在 Postman 中运行良好,并提供有效的响应,但无法生成 OpenAPI/Swagger UI 自动文档。

class Role(str, Enum):
     Internal = "internal"
     External = "external"


class Info(BaseModel):
    id: int
    role: Role

class AppInfo(Info):
    info: str


@app.post("/api/v1/create", status_code=status.HTTP_200_OK)
async def create(info: Info, apikey: Union[str, None] = Header(str)):
    if info:
        alias1 = AppInfo(info="Portal Gun", id=123, role=info.role)
        alias2 = AppInfo(info="Plumbus", id=123, , role=info.role)
        info_dict.append(alias1.dict())
        info_dict.append(alias2.dict())

        
        return {"data": info_dict}
    else:
        
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"Please provide the input"
        )
Run Code Online (Sandbox Code Playgroud)

收到错误:

TypeError: Object of type 'type' is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

python swagger swagger-ui openapi fastapi

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

FastAPI 创建适合需求的通用响应模型

我使用 FastAPI 一段时间了,它是一个很棒的框架。\n但是现实生活中的场景可能会令人惊讶,有时需要使用非标准方法。我有一个案例想请您帮忙。

\n

有一个奇怪的外部要求,模型响应的格式应如示例中所述:

\n

期望的行为:

\n

GET /object/1

\n
{status: \xe2\x80\x98success\xe2\x80\x99, data: {object: {id:\xe2\x80\x981\xe2\x80\x99, category: \xe2\x80\x98test\xe2\x80\x99 \xe2\x80\xa6}}}\n
Run Code Online (Sandbox Code Playgroud)\n

GET /objects

\n
{status: \xe2\x80\x98success\xe2\x80\x99, data: {objects: [...]}}}\n
Run Code Online (Sandbox Code Playgroud)\n

当前行为:

\n

GET/object/1将响应:

\n
{id: 1,field1:"content",... }\n
Run Code Online (Sandbox Code Playgroud)\n

GET/objects/将发送对象列表,例如:

\n
{\n [\n   {id: 1,field1:"content",... },\n   {id: 1,field1:"content",... },\n    ...\n ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

您可以用任何类替换“对象”,这仅用于描述目的。

\n

如何编写适合这些要求的通用响应模型?

\n

我知道我可以生成包含status:str和 (取决于类)数据结构的响应模型,例如ticket:Tickettickets:List[Ticket]

\n

重点是有很多类,所以我希望有一种更Pythonic 的方法来做到这一点。

\n

感谢帮助。

\n

python rest fastapi

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

FastAPI 上是否可以有一个带有默认值的必需查询参数?

我试图设置一个必需的查询参数,但在 FastAPI 上给它一个默认值,但我在他们的用户指南上没有找到任何内容。

在 openapi 上,它会是这样的:

parameters:
      - name: "some_name"
        in: "query"
        description: "a description"
        required: true
        type: "string"
        default: "First"
        enum:
        - "First"
        - "Second"
        - "Third"
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,required 被分配为 true 并且我有一个默认值(“first”)使用 fastapi 我有这个:

class ModelNames(str, Enum):
  first = "first"
  second = "second"
  third = "third"


@app.post("/path")
async def this_function(
    modelInstance = Query(
      default=Required, # i would like to somehow assign "first" and Required to default 
      description="a description"
    )
  ):
  return None
Run Code Online (Sandbox Code Playgroud)

我尝试过直接分配“first”,但它使其成为可选的。

python swagger openapi fastapi

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

如何使用FastApi和SqlAlchemy进行异步操作

我正在使用翻译软件,表达上可能存在一些错误,请理解我已经查了网上的教程并按照相应的思路进行操作,但是我遇到了一点问题,我无法使用异步SqlAlchemyc来操作Mysql。

数据库连接

from sqlalchemy import create_engine
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
from urllib import  parse
import  sys

engine = create_async_engine(Sql_URL)


SessionLocal = sessionmaker(bind=engine,autocommit=False,autoflush=False)
db_session = scoped_session(SessionLocal)

Base = declarative_base()
Base.query = db_session.query_property()
Run Code Online (Sandbox Code Playgroud)

楷模

import asyncio
import datetime

from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, MetaData
from sqlalchemy.orm import registry
from  sqlalchemy_utils import EmailType,ChoiceType

from app.Fast_blog.database import Base


class user(Base):
    choices = [
        ('0', 'woman'),
        ('1', 'man'),
        ('2', 'NULL')
    ]
    __tablename__ …
Run Code Online (Sandbox Code Playgroud)

sqlalchemy python-3.x python-asyncio fastapi

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

FastAPI 与异步 Flask 的基准?

我是一名对基准测试不感兴趣的开发人员,我正在尝试决定是否应该使用 Flask 还是 FastAPI 来构建一些 Python/Vue 项目。我在网上看到有关 FastAPI 如何比 Flask 更快的内容,因为 Flask 是单线程或类似的东西,而 FastAPI 是异步的,但显然最近 Flask 添加了异步路由,所以现在我想知道 FastAPI 是否仍然是(?) 比 Flask 更快。

有人做过比较 FastAPI 和 Flask 异步路由的基准测试吗?当我搜索谷歌时我找不到任何东西。

python flask fastapi

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

Uvicorn / Fastapi 如何处理 1 个工作线程和同步端点的并发?

了解 Uvicorn 异步行为

我试图了解 Uvicorn 的行为。我创建了一个示例 fastapi 应用程序,主要休眠 5 秒。

import time
from datetime import datetime


from fastapi import FastAPI


app = FastAPI()

counter = 0

@app.get("/")
def root():
    global counter
    counter = counter + 1
    my_id = counter
    print(f'I ({my_id}) am feeling sleepy')
    time.sleep(5)
    print(f'I ({my_id}) am done sleeping')
    return {}
Run Code Online (Sandbox Code Playgroud)

我使用 Apache Bench 的以下命令调用我的应用程序:

ab -n 5 -c 5 http://127.0.0.1:8000/
Run Code Online (Sandbox Code Playgroud)

输出:

I (1) am feeling sleepy  -- 0s
I (1) am done sleeping   -- 5s
I (2) am …
Run Code Online (Sandbox Code Playgroud)

python python-asyncio fastapi uvicorn

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

FastAPI可以同时注册多个路由器吗

我在文档中发现路由器是这样注册的:

app.include_router(router1)
app.include_router(router2)
Run Code Online (Sandbox Code Playgroud)

但如果我只是想包含一个路由器列表(比如如果我有 100 个路由器,我必须重复这 100 次),这似乎不必要地冗长?有没有办法将它们传递到列表或其他东西中?谢谢!

python fastapi

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

使用 MyPy 的项目中的 FastAPI/Pydantic

我目前正在学习 fastAPI 教程,我的环境设置了 black、flake8、bandit 和 mypy。本教程中的所有内容都运行良好,但我一直不得不 # type: ignore things 让 mypy 合作。

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None


@app.post("/items/")
async def create_items(item: Item) -> Item:
    return item
Run Code Online (Sandbox Code Playgroud)

Mypy然后错误:

 ? mypy main.py                                                                                                                                                                                                 [14:34:08]
main.py:9: error: Incompatible types in assignment (expression has type "None", variable has type "str")
main.py:11: error: Incompatible types in assignment (expression has type "None", variable has type "float") 
Run Code Online (Sandbox Code Playgroud)

我可以 # type: ignore,但随后我丢失了编辑器中的类型提示和验证。我是否遗漏了一些明显的东西,还是应该为 FastAPI 项目禁用 mypy?

python mypy pydantic fastapi

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

FastAPI 等效于 Flask 的 request.form,用于不可知的表单

我尝试从 Flask 迁移到 FastAPI,我想知道是否有类似于 Flask 的东西:

payload = request.form.to_dict(flat=False)
payload = {key:payload[key][0] for key in payload}
Run Code Online (Sandbox Code Playgroud)

对于 FastAPI。

到目前为止,我只发现了一些技巧,您是否仍然必须将表单的所有参数一一实现给函数:

from pydantic import BaseModel
class FormData(BaseModel):
    alfa: str=Form(...)
    vita: str=Form(...)
async def Home(request: Request, form_data:FormData)
Run Code Online (Sandbox Code Playgroud)

这个例子当然比标准的表单处理在可读性上更好:

async def Home(username: str = Form(...), something_else: str = Form(...)):
Run Code Online (Sandbox Code Playgroud)

但由于所有表单字段的必要声明,它仍然非常受限。

还有其他更不可知和优雅的方法吗?

提前致谢,如果这是我无法通过谷歌搜索找到的微不足道的问题,我深表歉意:)

html python forms flask fastapi

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

在python FastAPI中解析数据时出错

我正在学习使用 FastAPI,并且在实现一个简单的 API 时一遍又一遍地出现此错误,但我无法弄清楚原因

"detail": "There was an error parsing the body"
Run Code Online (Sandbox Code Playgroud)

这发生在我这两个端点上:

完整代码:代码库

片段:

app_v1 = FastAPI(root_path='/v1')

# JWT Token request
@app_v1.post('/token')
async def login_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
    jwt_user_dict = {"username": form_data.username, "password": form_data.password}
    jwt_user = JWTUser(**jwt_user_dict)
    user = authenticate_user(jwt_user)
    if user is None:
        return HTTP_401_UNAUTHORIZED
    jwt_token = create_jwt_token(user)
    return {"token": jwt_token}
Run Code Online (Sandbox Code Playgroud)

要求:

在此处输入图片说明

在此处输入图片说明

@app_v1.post("/user/photo")
async def update_photo(response: Response, profile_photo: bytes = File(...)):
    response.headers['x-file-size'] = str(len(profile_photo))
    response.set_cookie(key='cookie-api', value="test")
    return {"profile photo size": len(profile_photo)}
Run Code Online (Sandbox Code Playgroud)

要求: 在此处输入图片说明

python python-3.x fastapi

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