我试图权衡设置Content-LengthHTTP标头与使用分块编码从我的服务器返回[可能]大文件的优缺点.需要使用持久连接来满足HTTP 1.1规范中的一个或另一个.我看到Content-Length标题的优点是:
缺点是必须在返回对象之前计算大小,这并不总是实用并且可能会增加服务器/数据库利用率.分块编码的缺点是在每个块和下载进度条之前添加块大小的开销很小.有什么想法吗?我可能没有想到的两种方法的任何其他HTTP注意事项?
我正在尝试使用 FastAPI 来允许我的(dockerized)服务器响应返回的 API 调用
image,以及additional_dict(对于机器学习示例,这可能是来自分类器和显着性图的分类标签)。
就我而言,我认为使用相同的端点来获取两个对象是有意义的,因为它们是通过相同的计算生成的。
我可以使用/sf/answers/3913353601/的内容成功返回二进制图像:
from PIL import Image
from fastapi import FastAPI, File
import tempfile
from starlette.responses import FileResponse
@app.post("/getstuff")
async def get_image_and_data(file: bytes = File(...)):
image, additional_dict = process_image(image)
with tempfile.NamedTemporaryFile(mode="w+b", suffix=".png", delete=False) as outfile:
image.save(outfile)
return FileResponse(outfile.name, media_type="image/png")
Run Code Online (Sandbox Code Playgroud)
当我通过 上的 swagger UI 调用服务时,这甚至允许我看到图像响应localhost:8000/docs。
但是,我不知道如何将图像二进制和字典放在一起。
我尝试将我的 return 语句替换为:
return FileResponse(outfile.name, media_type="image/png"), additional_dict
Run Code Online (Sandbox Code Playgroud)
但这并没有真正起作用(当在 localhost:8000/docs 上尝试 swagger 时,我只是得到下面的 json 回复,其中包含创建的临时文件的路径)
[{
"path": "/tmp/tmpldwe_79d.png",
"status_code": 200,
"filename": …Run Code Online (Sandbox Code Playgroud) 我有一个通常的静态站点,服务器在其中捕获.html文件并将其发送。
我了解Transfer-Encoding: chunked动态服务器页面的重要性,因为这是针对动态服务器页面而设计的。加速可能非常令人难以置信。但是,静态文件的速度增加是否相同?当Content-Length文件通过网络到达时,浏览器是否已经逐步使用&的请求进行渲染和获取?
我有一些非常巨大的HTML(百页范围内的文档),因此渐进式HTML处理至关重要。(有点像WHATWG如何提供整体式单页HTML5规范。)
我发现如何使用 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 文件。
如何将数组显示为图像?
在使用 Opencv 比较两个图像后,我试图在 fastAPI 中返回一个图像。
这是我到目前为止所做的:
from fastapi import FastAPI , File, UploadFile
import numpy as np
from cv2 import *
import os
import base64
app = FastAPI(debug = True)
@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...),file1: UploadFile = File(...)):
content = await file.read()
nparr = np.fromstring(content, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
content1 = await file1.read()
nparr1 = np.fromstring(content1, np.uint8)
img1 = cv2.imdecode(nparr1, cv2.IMREAD_COLOR)
akaze = cv2.AKAZE_create()
kpts1, desc1 = akaze.detectAndCompute(img, None)
kpts2, desc2 = akaze.detectAndCompute(img1, None)
matcher = cv2.DescriptorMatcher_create(cv2.DescriptorMatcher_BRUTEFORCE_HAMMING) …Run Code Online (Sandbox Code Playgroud)