相关疑难解决方法(0)

FastAPI - 如何在中间件中获取响应正文

有没有办法在中间件中获取响应内容?以下代码是从此处复制的。

@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.time()

    response = await call_next(request)

    process_time = time.time() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response
Run Code Online (Sandbox Code Playgroud)

python middleware response fastapi

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

如何上传大文件(?3GB)到FastAPI后端?

我正在尝试将一个大文件 (\xe2\x89\xa53GB) 上传到我的 FastAPI 服务器,而不将整个文件加载到内存中,因为我的服务器只有 2GB 可用内存。

\n

服务器端

\n
async def uploadfiles(upload_file: UploadFile = File(...):\n
Run Code Online (Sandbox Code Playgroud)\n

客户端

\n
m = MultipartEncoder(fields = {"upload_file":open(file_name,\'rb\')})\nprefix = "http://xxx:5000"\nurl = "{}/v1/uploadfiles".format(prefix)\ntry:\n    req = requests.post(\n    url,\n    data=m,\n    verify=False,\n            )\n
Run Code Online (Sandbox Code Playgroud)\n

返回:

\n
async def uploadfiles(upload_file: UploadFile = File(...):\n
Run Code Online (Sandbox Code Playgroud)\n

我不确定MultipartEncoder实际发送到服务器的内容,因此请求不匹配。有任何想法吗?

\n

python file-upload starlette fastapi python-requests-toolbelt

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

如何使 FastAPI 服务器可从本地网络外部访问?

我第一次使用 FastAPI 开发一个小型 API。我用来uvicorn运行该应用程序。

当我使用时:

$ uvicorn main:app --host 0.0.0.0
Run Code Online (Sandbox Code Playgroud)

我可以从网络内部(使用我的公共 IP)访问该应用程序,但不能从外部访问该应用程序。我已经检查了防火墙,甚至尝试完全禁用它,但是没有任何效果。我只是希望能够向外界展示该应用程序。我怎样才能做到这一点?

networking fastapi

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

FastAPI UploadFile 与 Flask 相比慢

我创建了一个端点,如下所示:

@app.post("/report/upload")
def create_upload_files(files: UploadFile = File(...)):
        try:
            with open(files.filename,'wb+') as wf:
                wf.write(file.file.read())
                wf.close()
        except Exception as e:
            return {"error": e.__str__()}
Run Code Online (Sandbox Code Playgroud)

它是用 uvicorn 启动的:

../venv/bin/uvicorn test_upload:app --host=0.0.0.0 --port=5000 --reload
Run Code Online (Sandbox Code Playgroud)

我正在执行一些测试,使用 Python 请求上传大约100 MB的文件,大约需要 128 秒:

../venv/bin/uvicorn test_upload:app --host=0.0.0.0 --port=5000 --reload
Run Code Online (Sandbox Code Playgroud)

我使用 Flask 通过 API 端点测试了相同的上传脚本,大约需要 0.5 秒:

f = open(sys.argv[1],"rb").read()
hex_convert = binascii.hexlify(f)
items = {"files": hex_convert.decode()}
start = time.time()
r = requests.post("http://192.168.0.90:5000/report/upload",files=items)
end = time.time() - start
print(end)
Run Code Online (Sandbox Code Playgroud)

我做错了什么吗?

python upload file-upload starlette fastapi

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

如何使用FastAPI下载大文件?

我正在尝试从 FastAPI 后端下载一个大文件 ( .tar.gz)。在服务器端,我只是验证文件路径,然后Starlette.FileResponse返回整个文件\xe2\x80\x94,就像我在 StackOverflow 上的许多相关问题中看到的那样。

\n

服务器端:

\n
return FileResponse(path=file_name, media_type=\'application/octet-stream\', filename=file_name)\n
Run Code Online (Sandbox Code Playgroud)\n

之后,我收到以下错误:

\n
  File "/usr/local/lib/python3.10/dist-packages/fastapi/routing.py", line 149, in serialize_response\n    return jsonable_encoder(response_content)\n  File "/usr/local/lib/python3.10/dist-packages/fastapi/encoders.py", line 130, in jsonable_encoder\n    return ENCODERS_BY_TYPE[type(obj)](obj)\n  File "pydantic/json.py", line 52, in pydantic.json.lambda\nUnicodeDecodeError: \'utf-8\' codec can\'t decode byte 0x8b in position 1: invalid start byte\n
Run Code Online (Sandbox Code Playgroud)\n

我也尝试使用StreamingResponse,但得到了同样的错误。还有其他方法可以做到吗?

\n

我的代码中的StreamingResponse

\n
  File "/usr/local/lib/python3.10/dist-packages/fastapi/routing.py", line 149, in serialize_response\n    return jsonable_encoder(response_content)\n  File "/usr/local/lib/python3.10/dist-packages/fastapi/encoders.py", line 130, in jsonable_encoder\n    return ENCODERS_BY_TYPE[type(obj)](obj)\n  File …
Run Code Online (Sandbox Code Playgroud)

python download starlette pydantic fastapi

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

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
查看次数

如何在 Google Colab 中运行 FastAPI / Uvicorn?

我正在尝试使用 FastAPI / Uvicorn 在 Google Colab 上运行“本地”网络应用程序,就像我见过的一些 Flask 应用程序示例代码一样,但无法使其工作。有没有人能够做到这一点?欣赏它。

成功安装 FastAPI & Uvicorn

!pip install FastAPI -q
!pip install uvicorn -q
Run Code Online (Sandbox Code Playgroud)

示例应用程序

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}
Run Code Online (Sandbox Code Playgroud)

运行尝试

#attempt 1
if __name__ == "__main__":
    uvicorn.run("/content/fastapi_002:app", host="127.0.0.1", port=5000, log_level="info")
Run Code Online (Sandbox Code Playgroud)

#attempt 2
#uvicorn main:app --reload
!uvicorn "/content/fastapi_001.ipynb:app" --reload
Run Code Online (Sandbox Code Playgroud)

python google-colaboratory fastapi uvicorn

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

在 FastAPI 中渲染 NumPy 数组

我发现如何使用 FastAPI 将 numpy 数组作为图像返回?然而,我仍然在努力展示图像,它看起来只是一个白色的方块。

io.BytesIO我像这样读入一个数组:

def iterarray(array):
    output = io.BytesIO()
    np.savez(output, array)
    yield output.get_value()
Run Code Online (Sandbox Code Playgroud)

在我的端点中,我的回报是StreamingResponse(iterarray(), media_type='application/octet-stream')

当我留空media_type以推断时,会下载一个 zip 文件。

如何将数组显示为图像?

python numpy bytesio fastapi

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