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

时间:2015-05-07 10:44:29

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

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

将会对这些步骤的详细答案表示赞赏。

我正在使用djangorestframework==2.4.4Django==1.7.7作为API。

1 个答案:

答案 0 :(得分:0)

在客户端,不同的工具可能做的不同。在this post中完成了基于python-requests的客户端的简单实现。

但是对于解压缩,我认为最好在Web服务器级别完成,就像您对响应压缩所做的一样。 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',
]

以下是参考文献:

  1. Stackoverflow post on how to send gzipped reqeusts
  2. Python 3 gzip documentation
  3. Server fault thread on request body decompression
  4. Django middleware reference