首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当请求解压缩时,使用Starlette提供预先压缩的文件,但'accept-encoding‘包含'gzip’

当请求解压缩时,使用Starlette提供预先压缩的文件,但'accept-encoding‘包含'gzip’
EN

Stack Overflow用户
提问于 2021-09-14 11:01:51
回答 1查看 37关注 0票数 0

假设为request.url

代码语言:javascript
复制
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请求什么文件。

以下是路由处理程序的示例:

代码语言:javascript
复制
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的响应返回,因为浏览器不会期望压缩后的内容。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-14 11:52:54

也许做这件事的正确方法是在响应的头部设置'content-encoding': 'gzip'

因此,在上面的示例中,我基本上这样做:

代码语言:javascript
复制
return StreamingResponse(
    s3_result['Body'],
    headers={**s3_result['ResponseMetadata']['HTTPHeaders'], 'content-encoding': 'gzip'}
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69176530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档