标签: fastapi

pydantic 从模型中排除多个字段

在 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 这样更干净的东西,你可以在其中指定排除或包含的列表。

python model backend pydantic fastapi

16
推荐指数
3
解决办法
5万
查看次数

Python:带有 post 请求的 FastAPI 错误 422

我正在构建一个简单的 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 编码,并更改标题。没有什么对我有用。

python python-requests axios fastapi

15
推荐指数
5
解决办法
3万
查看次数

有没有办法干净地杀死 uvicorn?

有没有办法干净地杀死 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。

python python-3.x fastapi uvicorn

15
推荐指数
2
解决办法
5274
查看次数

如何在 Fast API 的单元测试中访问数据库?

我在 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")这不是正确的方法。但我很困惑,文档没有涵盖这种情况。

unit-testing sqlalchemy fastapi

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

返回带有字段名称而不是别名的 pydantic 模型作为 fastapi 响应

我试图用定义的字段名称而不是别名返回我的模型。

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)

我觉得应该可以在配置类中设置它,但我找不到正确的选项。

python pydantic fastapi

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

FastAPI 中的可选查询参数

我不明白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)

python optional-parameters fastapi

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

Pytest asyncio事件绑定到不同的事件循环,事件循环关闭

我正在尝试为我的 fastapi 应用程序编写一些测试

\n
\n

我正在使用prisma-client-py数据库。我不知道这是否会改变什么

\n
\n

一切都按预期工作,除了第一个和最后一个之外,它们都因相同的错误而失败:

\n
RuntimeError: <asyncio.locks.Event object at 0x7f5696832950 [unset]> is bound to a different event loop\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的conftest.py

\n
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)

python pytest prisma pytest-asyncio fastapi

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

使用 FastAPI 实例化和传递 Redis 客户端的推荐方法是什么

我将 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)

python redis fastapi

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

Pydantic 验证器删除空白字符串?

我有以下 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)。我怎样才能得到与第一种情况相同的结果?

python pydantic fastapi

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

FastAPI 处理和重定向 404

如果出现 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 来实现这一目标?

python http-status-code-404 fastapi

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