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

问题描述 投票:0回答:1

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

如果有详细的答案和步骤,我们将不胜感激。

我将

djangorestframework==2.4.4
Django==1.7.7
用于 API。

python json django rest django-rest-framework
1个回答
2
投票

从客户端来看,不同的工具可能会有不同的做法。

python-requests
的客户端的简单实现在这篇文章中完成。

但是至于解压缩,我认为最好在网络服务器级别完成,就像您对响应压缩所做的一样。 Nginx 似乎没有内置配置,但有人做了某种 Lua 在将请求传递到上游之前进行解压。

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

import gzip
from io import BytesIO


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 上关于如何发送 gzipped 请求的帖子,
  2. Python 3 gzip 文档,
  3. 请求正文解压时的服务器故障线程
  4. Django 中间件参考.
© www.soinside.com 2019 - 2024. All rights reserved.