假设为request.url
GET /fomantic-ui/default/semantic.min.css对于某些文件扩展名,例如.css,我需要提供一个压缩前的.gz版本。
从node-express我知道一种方法,当应用于Starlette时,将简单地操作request.url.path并将'.gz'附加到它。但是,这会导致AttributeError: Can't set attribute。
在Starlette的世界里会有什么方法呢?
我发现的唯一一件事,是一个可以处理GZIP请求的中间件。但我认为它在这里是不可用的,因为我需要自己的逻辑来决定从亚马逊网络服务S3存储桶或diskcache请求什么文件。
以下是路由处理程序的示例:
async def theme(request):
try:
file_path = request.path_params.get('file_path')
is_asset = file_path.split('.')[-1] in ['ico', 'png']
if is_asset:
full_path = f'assets/{file_path}'
else:
if 'gzip' in request.headers['accept-encoding']:
full_path = f'theme_build/{file_path}.gz'
request.url.path = request.url.path + '.gz' # results in AttributeError("can't set attribute")
else:
full_path = f'theme_build/{file_path}'
print(full_path, flush=True)
s3_result = get_file(full_path)
return StreamingResponse(s3_result['Body'], headers=s3_result['ResponseMetadata']['HTTPHeaders'])
except ...显然,我不能将压缩后的内容作为对原始request.url的响应返回,因为浏览器不会期望压缩后的内容。
发布于 2021-09-14 11:52:54
也许做这件事的正确方法是在响应的头部设置'content-encoding': 'gzip'。
因此,在上面的示例中,我基本上这样做:
return StreamingResponse(
s3_result['Body'],
headers={**s3_result['ResponseMetadata']['HTTPHeaders'], 'content-encoding': 'gzip'}
)https://stackoverflow.com/questions/69176530
复制相似问题