在 Django 中为来自客户端的请求和来自服务器的响应(REST API)压缩 JSON 有效负载。

Posted

技术标签:

【中文标题】在 Django 中为来自客户端的请求和来自服务器的响应(REST API)压缩 JSON 有效负载。【英文标题】:Compress JSON payload in Django for both request from client and response from server (REST API). 【发布时间】:2015-07-17 21:24:22 【问题描述】:

我想知道是否有一种方法可以压缩我每次都必须发送的带有许多重复字段名称的 JSON 有效负载。虽然this question 只是关于压缩响应,但我也想知道如何压缩来自客户端(可能是移动应用程序)的 JSON 有效负载。另外,我想知道如何在客户端和服务器端将压缩的 JSON 文件转换回其原始结构。

我们将不胜感激。

我将djangorestframework==2.4.4Django==1.7.7 一起用于API。

【问题讨论】:

使用较短的 JSON 属性名称? 【参考方案1】:

从客户端不同的工具可能会以不同的方式完成它。基于python-requests 的客户端的简单实现在this post 中完成。

但至于解压缩,我认为最好在 webserver 级别完成,就像您为响应压缩所做的一样。 nginx 似乎没有内置配置,但有人在将请求传递给上游之前完成了sort of Lua 进行解压缩。

另一个 - 可能效率较低 - 解决方案是在第一个 Django 中间件中进行解压缩,如下所示:

import gzip


class SimpleMiddleware:
    def __init__(self, get_response):
       self.get_response = get_response

    def __call__(self, request):

        # check the headers if you are writing a versatile API
        # decompress the request body
        request._body = gzip.decompress(request.body)
        # fill the request stream in case you're using something like django-rest-framework
        request._stream = BytesIO(request.body)

        response = self.get_response(request)

        return response

此外,您必须将中间件配置为第一个中间件:

# in Django settings

MIDDLEWARE = [
    'python path to our new custom middleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

以下是参考资料:

    *** post on how to send gzipped reqeusts, Python 3 gzip documentation, Server fault thread on request body decompression, Django middleware reference。

【讨论】:

以上是关于在 Django 中为来自客户端的请求和来自服务器的响应(REST API)压缩 JSON 有效负载。的主要内容,如果未能解决你的问题,请参考以下文章

无法解码来自客户端的握手请求

为啥 ZeroMQ 服务器没有收到来自客户端的任何请求?

如何在 ASP.NET Core 5.0 中处理来自客户端的双重请求?

来自 Qt5 中 http 客户端的 Post 方法

延迟来自客户端的并发请求,直到创建 HttpSession

Select总结