在Django中压缩JSON负载,适用于客户端请求和服务器响应(REST API)。

13

我想知道是否有一种方法可以压缩JSON有效负载,以便每次发送都不用重复字段名。虽然这个问题仅涉及响应的压缩,但我想知道如何压缩来自客户端(可能是移动应用程序)的JSON有效负载。此外,我想知道如何在客户端和服务器端将压缩的JSON文件转换回其原始结构。

详细的步骤答案将不胜感激。

我正在使用djangorestframework==2.4.4Django==1.7.7进行API。


使用更短的JSON属性名称? - Mark Schultheiss
1个回答

1

从客户端的角度来看,不同的工具可能采用了不同的方法。一个基于python-requests的简单实现可以在this post中找到。

但是关于解压缩,我认为最好在Web服务器层面上完成,就像你对响应压缩所做的一样。似乎没有Nginx的内置配置,但有人已经通过一种类似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',
]

以下是参考资料:
  1. 如何发送gzip请求的Stackoverflow帖子,
  2. Python 3 gzip文档,
  3. 服务器故障线程关于请求体解压缩,
  4. Django中间件参考

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接