在 pydantic 中,有一种更干净的方法可以从模型中排除多个字段,例如:
class User(UserBase):
class Config:
exclude = ['user_id', 'some_other_field']
Run Code Online (Sandbox Code Playgroud)
我知道以下有效。
class User(UserBase):
class Config:
fields = {'user_id': {'exclude':True},
'some_other_field': {'exclude':True}
}
Run Code Online (Sandbox Code Playgroud)
但我一直在寻找像 django Rest Framework 这样更干净的东西,你可以在其中指定排除或包含的列表。
我正在构建一个简单的 API 来测试数据库。当我使用 get request 时一切正常,但如果我更改为 post,我会收到“无法处理的实体”错误:
这是 FastAPI 代码:
from fastapi import FastAPI
app = FastAPI()
@app.post("/")
def main(user):
return user
Run Code Online (Sandbox Code Playgroud)
然后,我的请求使用 javascript
let axios = require('axios')
data = {
user: 'smith'
}
axios.post('http://localhost:8000', data)
.then(response => (console.log(response.url)))
Run Code Online (Sandbox Code Playgroud)
并使用 Python
import requests
url = 'http://127.0.0.1:8000'
data = {'user': 'Smith'}
response = requests.post(url, json=data)
print(response.text)
Run Code Online (Sandbox Code Playgroud)
我也尝试解析为 json,使用 utf-8 编码,并更改标题。没有什么对我有用。
有没有办法干净地杀死 uvicorn?
即,如果它在终端的前台运行,我可以在它上面键入 ^C。这会导致 uvivorn 进程终止,并且所有工作进程都将被清理。(即,他们走开了。)
另一方面,如果 uvicorn 在没有终端的情况下在后台运行,那么我无法想出一种干净地杀死它的方法。它似乎忽略了 SIGTERM、SIGINT 和 SIGHUP。我可以用SIGKILL(即-9)杀死它,但是工作进程仍然存在,我必须跟踪所有工作进程并杀死它们。这并不理想。
我在 Red Hat Enterprise Linux Server 7.3 (Maipo) 上使用带有 CPython 3.7.4、uvivorn 版本 0.11.2 和 FastAPI 0.46.0 的 uvicorn。
我在 Fast API 中进行单元测试时很难访问 SQLAlchemy。
def test_successful_register_ios():
response = client.post("/register/",headers={},json={})
assert response.status_code == 201
device = get_db().query(Device).get("a1")
assert device.expires_at == mydate
Run Code Online (Sandbox Code Playgroud)
AttributeError:“生成器”对象没有属性“查询”
在我的测试类中,我应用了所有覆盖:
from database.database import Base
from main import app, get_db
settings = Settings()
engine = create_engine(settings.sqlalchemy_database_uri)
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base.metadata.create_all(bind=engine)
client = TestClient(app)
def override_get_db():
try:
db = TestingSessionLocal()
yield db
finally:
db.close()
app.dependency_overrides[get_db] = override_get_db
Run Code Online (Sandbox Code Playgroud)
我认为get_db().query(Device).get("a1")这不是正确的方法。但我很困惑,文档没有涵盖这种情况。
我试图用定义的字段名称而不是别名返回我的模型。
class FooModel(BaseModel):
foo: str = Field(..., alias="bar")
@app.get("/") -> FooModel:
return FooModel(**{"bar": "baz"})
Run Code Online (Sandbox Code Playgroud)
{"bar": "baz"}当我想要的时候就会得到回应{"foo": "baz"}。我知道使用dict模型的方法时这在某种程度上是可能的,但感觉不对并且会扰乱请求处理程序的输入。
@app.get("/") -> FooModel:
return FooModel(**{"bar": "baz"}).dict(by_alias=False)
Run Code Online (Sandbox Code Playgroud)
我觉得应该可以在配置类中设置它,但我找不到正确的选项。
我不明白FastAPI 中的可选查询参数。它与默认值为 的默认查询参数有何不同None?
如上面链接中所述,下面的示例中的可选查询参数arg1与 之间有什么区别?arg2arg2
@app.get("/info/")
async def info(arg1: int = None, arg2: int | None = None):
return {"arg1": arg1, "arg2": arg2}
Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的 fastapi 应用程序编写一些测试
\n\n\n我正在使用
\nprisma-client-py数据库。我不知道这是否会改变什么
一切都按预期工作,除了第一个和最后一个之外,它们都因相同的错误而失败:
\nRuntimeError: <asyncio.locks.Event object at 0x7f5696832950 [unset]> is bound to a different event loop\nRun Code Online (Sandbox Code Playgroud)\n这是我的conftest.py
import os\nimport asyncio\nimport pytest\nfrom typing import Any, AsyncGenerator, Generator, Iterator\n\nfrom fastapi import FastAPI\nfrom fastapi.testclient import TestClient\nfrom prisma import Prisma, register\n\n\nfrom server.database.base import *\nfrom server.config.exceptions import configure_exception_handlers\nfrom server.config.settings import settings\nfrom server.apis import apis\n\n\ndef start_application() -> FastAPI:\n """\n Return a FastAPI app\n """\n _app = FastAPI(\n title=str(settings.TITLE),\n description=str(settings.DESCRIPTION),\n version=str(settings.VERSION),\n )\n configure_exception_handlers(_app)\n _app.include_router(apis)\n return …Run Code Online (Sandbox Code Playgroud) 我将 FastAPI 与 Redis 结合使用。我的应用程序看起来像这样
from fastapi import FastAPI
import redis
# Instantiate redis client
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
# Instantiate fastapi app
app = FastAPI()
@app.get("/foo/")
async def foo():
x = r.get("foo")
return {"message": x}
@app.get("/bar/")
async def bar():
x = r.get("bar")
return {"message": x}
Run Code Online (Sandbox Code Playgroud)
像这样创建r模块范围的变量是不好的做法吗?如果是的话有什么缺点?
在 Tiangolo 关于设置SQL 数据库连接的教程中,他使用了依赖项,我想在我的例子中它看起来像这样
from fastapi import Depends, FastAPI
import redis
# Instantiate fastapi app
app = FastAPI()
# Dependency
def get_redis():
return redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) …Run Code Online (Sandbox Code Playgroud) 我有以下 Pydantic 模型:
class Report(BaseModel):
id: int
name: str
grade: float = None
proportion: float = None
@validator('*', pre=True)
def blank_strings(cls, v):
print(v)
if v == "":
return None
return v
Run Code Online (Sandbox Code Playgroud)
我的目标是能够将空字符串视为空值,但它似乎不起作用。
Report(id=5,name="Steve",grade=0.5)
创建一个实例,其中proportion=Nonebut...
Report(id=5,name="Steve",grade=0.5,proportion="")抛出 error value is not a valid float (type=type_error.float)。我怎样才能得到与第一种情况相同的结果?
如果出现 HTTPException,如何使用 FastAPI 重定向请求?
在 Flask 中我们可以这样实现:
@app.errorhandler(404)
def handle_404(e):
if request.path.startswith('/api'):
return render_template('my_api_404.html'), 404
else:
return redirect(url_for('index'))
Run Code Online (Sandbox Code Playgroud)
或者在 Django 中我们可以使用 django.shortcuts:
from django.shortcuts import redirect
def view_404(request, exception=None):
return redirect('/')
Run Code Online (Sandbox Code Playgroud)
我们如何使用 FastAPI 来实现这一目标?
fastapi ×10
python ×9
pydantic ×3
axios ×1
backend ×1
model ×1
prisma ×1
pytest ×1
python-3.x ×1
redis ×1
sqlalchemy ×1
unit-testing ×1
uvicorn ×1