该代码在 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) 我使用 FastAPI 一段时间了,它是一个很棒的框架。\n但是现实生活中的场景可能会令人惊讶,有时需要使用非标准方法。我有一个案例想请您帮忙。
\n有一个奇怪的外部要求,模型响应的格式应如示例中所述:
\n期望的行为:
\nGET /object/1
{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}}}\nRun Code Online (Sandbox Code Playgroud)\nGET /objects
{status: \xe2\x80\x98success\xe2\x80\x99, data: {objects: [...]}}}\nRun Code Online (Sandbox Code Playgroud)\n当前行为:
\nGET/object/1将响应:
{id: 1,field1:"content",... }\nRun Code Online (Sandbox Code Playgroud)\nGET/objects/将发送对象列表,例如:
{\n [\n {id: 1,field1:"content",... },\n {id: 1,field1:"content",... },\n ...\n ]\n}\nRun Code Online (Sandbox Code Playgroud)\n您可以用任何类替换“对象”,这仅用于描述目的。
\n如何编写适合这些要求的通用响应模型?
\n我知道我可以生成包含status:str和 (取决于类)数据结构的响应模型,例如ticket:Ticket或tickets:List[Ticket]。
重点是有很多类,所以我希望有一种更Pythonic 的方法来做到这一点。
\n感谢帮助。
\n我试图设置一个必需的查询参数,但在 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”,但它使其成为可选的。
我正在使用翻译软件,表达上可能存在一些错误,请理解我已经查了网上的教程并按照相应的思路进行操作,但是我遇到了一点问题,我无法使用异步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) 我是一名对基准测试不感兴趣的开发人员,我正在尝试决定是否应该使用 Flask 还是 FastAPI 来构建一些 Python/Vue 项目。我在网上看到有关 FastAPI 如何比 Flask 更快的内容,因为 Flask 是单线程或类似的东西,而 FastAPI 是异步的,但显然最近 Flask 添加了异步路由,所以现在我想知道 FastAPI 是否仍然是(?) 比 Flask 更快。
有人做过比较 FastAPI 和 Flask 异步路由的基准测试吗?当我搜索谷歌时我找不到任何东西。
了解 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) 我在文档中发现路由器是这样注册的:
app.include_router(router1)
app.include_router(router2)
Run Code Online (Sandbox Code Playgroud)
但如果我只是想包含一个路由器列表(比如如果我有 100 个路由器,我必须重复这 100 次),这似乎不必要地冗长?有没有办法将它们传递到列表或其他东西中?谢谢!
我目前正在学习 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?
我尝试从 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)
但由于所有表单字段的必要声明,它仍然非常受限。
还有其他更不可知和优雅的方法吗?
提前致谢,如果这是我无法通过谷歌搜索找到的微不足道的问题,我深表歉意:)
我正在学习使用 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)
fastapi ×10
python ×9
flask ×2
openapi ×2
python-3.x ×2
swagger ×2
forms ×1
html ×1
mypy ×1
pydantic ×1
rest ×1
sqlalchemy ×1
swagger-ui ×1
uvicorn ×1