【问题标题】:Django rest framework, set the api response Content-Encoding to gzipDjango rest框架,设置api响应Content-Encoding为gzip
【发布时间】:2017-09-21 04:36:18
【问题描述】:

我正在开发 django 项目,当他们通过 api 调用请求某些特定数据时,它充当其他服务器的分发服务器,这些数据是 JSON 格式的,并且非常大。所以我在想有没有什么办法可以设置我的 DRF APIView 响应来提供输出的 JSON 响应,并为 Content-Encoding 设置 gzip 以便在其他服务器使用时减小内容的大小。

目前我的应用程序在 gunicorn 上运行,前面有 nginx 作为代理。

【问题讨论】:

    标签: python json django http django-rest-framework


    【解决方案1】:

    Django 有一个内置的gzip middleware

    如果您使用的是 django 版本 settings.py:

    MIDDLEWARE_CLASSES = [
        'django.middleware.gzip.GZipMiddleware',
        ...
    ]
    

    如果您使用的是 django 版本 > 1.10:

    MIDDLEWARE = [
        'django.middleware.gzip.GZipMiddleware',
        ...
    ]
    

    此中间件应放在任何其他需要读取或写入响应正文的中间件之前,以便随后进行压缩。

    为什么? 因为对于传入的请求,django 使用设置中定义的从上到下的中间件处理请求。 对于出局的响应中间件被称为自下而上。

    因此将gzip中间件声明为第一个中间件将使传入的请求能够被解压以被其他中间件读取;并且传出的响应在离开前会被压缩,这样就不会干扰其他中间件的操作。

    【讨论】:

    • 解释得很好,让我试一试,但从你的解释看来似乎有道理。
    • @xssChauhan 这对我有用。还有其他方法吗,可能是gzip的apache级别的一些标头设置?
    • @VaibhavKumar 您可以使用mod_deflate 对响应进行编码。如果可行,请为答案投票:)
    • 是的,它的工作是在/etc/apache2/mods-available/deflate.conf 中添加AddOutputFilterByType DEFLATE application/json。但是不知道用这个有没有什么弊端。
    • @VaibhavKumar 这是更好的方法。与 python 的 gzip 压缩/解压缩相比要快得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2015-12-13
    • 2017-09-02
    • 2016-08-27
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多