相关疑难解决方法(0)

FastAPI:如何从请求中获取原始 URL 路径?

我有一个GET在路径中带有请求参数的方法:

@router.get('/users/{user_id}')
async def get_user_from_string(user_id: str):
    return User(user_id)
Run Code Online (Sandbox Code Playgroud)

'/users/{user_id}'是否可以从请求中获取基本 url 原始路径(即)?

我尝试使用以下方式:

path = [route for route in request.scope['router'].routes if
        route.endpoint == request.scope['endpoint']][0].path
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我得到:

属性错误:“安装”对象没有属性“端点”

python url-routing starlette fastapi

5
推荐指数
2
解决办法
9137
查看次数

FastAPI返回大量JSON数据非常慢

我有一个 FastAPIGET端点,它返回大量 JSON 数据(约 160,000 行和 45 列)。毫不奇怪,使用返回数据非常json.dumps()慢。我首先使用文件中的数据读取数据json.loads(),并根据输入的参数对其进行过滤。有没有比使用更快的方法将数据返回给用户return data?以目前的状态,需要将近一分钟的时间。

我的代码目前如下所示:

# helper function to parse parquet file (where data is stored)
def parse_parquet(file_path):
    df = pd.read_parquet(file_path)
    result = df.to_json(orient = 'records')
    parsed = json.loads(result)
    return parsed
    

@app.get('/endpoint')
# has several more parameters
async def some_function(year = int | None = None, id = str | None = None):
    if year is None:
        data = parse_parquet(f'path/{year}_data.parquet')
    # no year
    if year is …
Run Code Online (Sandbox Code Playgroud)

python json dataframe pandas fastapi

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

为什么添加中间件打印HTTP请求体时fastapi会挂起?

我使用中间件来打印 HTTP 请求正文,以避免print每个函数中出现语句。但是,运行客户端代码时fastapi没有任何响应。

服务器简化为以下代码:

import typing

import uvicorn
from fastapi import FastAPI
from fastapi import Request, Body

app = FastAPI()


@app.middleware('http')
async def debug_request(request: Request, call_next):
    _body = await request.body()
    print(_body)
    #
    response = await call_next(request)
    return response


@app.put("/")
def _(
    _body: typing.Dict
):
    # print(_body)  # this statement is replaced by the middleware
    return {"detail": "ok"}


if __name__ == '__main__':
    uvicorn.run(app, host='localhost', port=8000)
Run Code Online (Sandbox Code Playgroud)

客户端代码如下:

import requests

_url = 'http://localhost:8000/'
_json = {
    'row_id': '1'
}
resp = …
Run Code Online (Sandbox Code Playgroud)

python starlette fastapi

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

FastAPI和SlowAPI限制所有“path/*”下的请求

我在使用 SlowAPI 时遇到问题。根据中间件限制所有请求,但我无法联合限制该路径下的所有请求/schools/

我的代码:

from fastapi import FastAPI, Request, Response, status
from fastapi.middleware.cors import CORSMiddleware
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded
from slowapi.middleware import SlowAPIMiddleware

limiter = Limiter(key_func=get_remote_address, default_limits=["2/5seconds"])
app = FastAPI()
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)

origins = ["http://127.0.0.1/", "http://localhost", "http://192.168.1.75"] ## CORS

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
app.add_middleware(SlowAPIMiddleware) ## Rate-limit all request

@app.get('/schools/{regione}/{provincia}/{comune}')
def search_school(request: Request, response: Response, regione: str, provincia: str, comune: str):
        return {"message": 'No schools …
Run Code Online (Sandbox Code Playgroud)

python fastapi slowapi

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

FastAPI 中间件中的后台任务

我正在尝试将后台任务添加到我的中间件中,但尚未在他们的文档中找到任何官方方法来执行此操作,这是我迄今为止尝试过的方法:

async def task1():
    logging.info("Waiting ...")
    time.sleep(5)
    logging.info("Waited.")

@app.middleware("http")
async def add_process_time_header(request, call_next, bt=Depends(BackgroundTasks)):
    a = bt.dependency()
    a.add_task(task1)
    a()

    return await call_next(request)
Run Code Online (Sandbox Code Playgroud)

这阻止了我的请求,我是否应该能够在没有等待的情况下调用异步函数?我想完全忽略后台任务的结果,我不需要 bg 任务的结果

python asynchronous fastapi

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

FastAPI - 如何修改来自内部依赖项的请求?

如何从依赖项内部修改请求?基本上我想test_value向请求添加一些信息(),然后能够从视图函数(在我的例子中是root()函数)获取它。

下面是一个简单的例子:

from fastapi import FastAPI, Depends, Request

app = FastAPI()

def test(request: Request):
    request['test_value'] = 'test value'

@app.get("/", dependencies=[Depends(test)])
async def root(request: Request):
    print(request.test_value)
    return {"test": "test root path."}
Run Code Online (Sandbox Code Playgroud)

python starlette fastapi

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

在 FastAPI 中等待 request.json() 永远挂起

我将此处给出的异常处理(https://github.com/tiangolo/fastapi/discussions/6678)添加到我的代码中,但我想打印完整的请求正文以查看完整的内容。但是,当我等待时,request.json()它永远不会终止。request.json()返回一个协程,因此我需要等待协程完成才能打印结果。如果向端点发送了无效请求,如何打印请求内容?

来自 github 的代码示例,我在错误处理程序和一个简单的端点中进行了 2 处更改。

import logging
from fastapi import FastAPI, Request, status
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from pydantic import BaseModel

app = FastAPI()


@app.exception_handler(RequestValidationError)
async def validation_exception_handler(
    request: Request, exc: RequestValidationError
) -> JSONResponse:
    exc_str = f"{exc}".replace("\n", " ").replace("   ", " ")
    logging.error(f"{request}: {exc_str}")
    body = await request.json()  # This line was added by me and never completes
    logging.error(body)  # This line was added by me
    content = …
Run Code Online (Sandbox Code Playgroud)

python freeze exceptionhandler starlette fastapi

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

在 Fastapi 应用程序上使用 loguru-log 请求参数进行 Python 日志记录

我有一个 fastapi 应用程序,我想记录在它上面发出的每个请求。我正在尝试为此使用 loguru 和 uvicorn,但我不知道如何打印与每个请求关联的标头和请求参数(如果有)。

我想要这样的东西:

INFO 2020-08-13 13:36:33.494 uvicorn.protocols.http.h11_impl:send - 127.0.0.1:52660 - "GET 
/url1/url2/ HTTP/1.1" 400 params={"some": value, "some1":value}
Run Code Online (Sandbox Code Playgroud)

有办法吗?谢谢你的帮助。

这里有一些链接:

loguru uvicorn fastapi

python logging fastapi uvicorn

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