婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 如何用Django處理gzip數據流

如何用Django處理gzip數據流

熱門標簽:天津塘沽區地圖標注 滴滴地圖標注公司 江門智能電話機器人 如何申請400電話代理 400電話在線如何申請 地圖標注可以遠程操作嗎 杭州房產地圖標注 智能電話機器人調研 甘肅高頻外呼系統

最近在工作中遇到一個需求,就是要開一個接口來接收供應商推送的數據。項目采用的python的django框架,我是想也沒想,就直接一梭哈,寫出了如下代碼:

class XXDataPushView(APIView):
  """
  接收xx數據推送
  """
		# ...
  @white_list_required
  def post(self, request, **kwargs):
    req_data = request.data or {}
				# ...

但隨后,發現每日數據并沒有任何變化,質問供應商是否沒有做推送,在忽悠我們。然后對方給的答復是,他們推送的是gzip壓縮的數據流,接收端需要主動進行解壓。此前從沒有處理過這種壓縮的數據,對方具體如何做的推送對我來說也是一個黑盒。

因此,我要求對方給一個推送的簡單示例,沒想到對方不講武德,仍過來一段沒法單獨運行的java代碼:

private byte[] compress(JSONObject body) {
  try {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    GZIPOutputStream gzip = new GZIPOutputStream(out);
    gzip.write(body.toString().getBytes());
    gzip.close();
    return out.toByteArray();
  } catch (Exception e) {
    logger.error("Compress data failed with error: " + e.getMessage()).commit();
  }
  return JSON.toJSONString(body).getBytes();
}

public void post(JSONObject body, String url, FutureCallbackHttpResponse> callback) {
  RequestBuilder requestBuilder = RequestBuilder.post(url);
  requestBuilder.addHeader("Content-Type", "application/json; charset=UTF-8");
  requestBuilder.addHeader("Content-Encoding", "gzip");

  byte[] compressData = compress(body);

  int timeout = (int) Math.max(((float)compressData.length) / 5000000, 5000);

  RequestConfig.Builder requestConfigBuilder = RequestConfig.custom();
  requestConfigBuilder.setSocketTimeout(timeout).setConnectTimeout(timeout);

  requestBuilder.setEntity(new ByteArrayEntity(compressData));

  requestBuilder.setConfig(requestConfigBuilder.build());

  excuteRequest(requestBuilder, callback);
}

private void excuteRequest(RequestBuilder requestBuilder, FutureCallbackHttpResponse> callback) {
  HttpUriRequest request = requestBuilder.build();
  httpClient.execute(request, new FutureCallbackHttpResponse>() {
    @Override
    public void completed(HttpResponse httpResponse) {
      try {
        int responseCode = httpResponse.getStatusLine().getStatusCode();
        if (callback != null) {
          if (responseCode == 200) {
            callback.completed(httpResponse);
          } else {
            callback.failed(new Exception("Status code is not 200"));
          }
        }
      } catch (Exception e) {
        logger.error("Get error on " + requestBuilder.getMethod() + " " + requestBuilder.getUri() + ": " + e.getMessage()).commit();
        if (callback != null) {
          callback.failed(e);
        }
      }

      EntityUtils.consumeQuietly(httpResponse.getEntity());
    }

    @Override
    public void failed(Exception e) {
      logger.error("Get error on " + requestBuilder.getMethod() + " " + requestBuilder.getUri() + ": " + e.getMessage()).commit();
      if (callback != null) {
        callback.failed(e);
      }
    }

    @Override
    public void cancelled() {
      logger.error("Request cancelled on " + requestBuilder.getMethod() + " " + requestBuilder.getUri()).commit();
      if (callback != null) {
        callback.cancelled();
      }
    }
  });
}

從上述代碼可以看出,對方將json數據壓縮為了gzip數據流stream。于是搜索django的文檔,只有這段關于gzip處理的裝飾器描述:

django.views.decorators.gzip 里的裝飾器控制基于每個視圖的內容壓縮。

  • gzip_page()

如果瀏覽器允許 gzip 壓縮,那么這個裝飾器將壓縮內容。它相應的設置了 Vary 頭部,這樣緩存將基于 Accept-Encoding 頭進行存儲。

但是,這個裝飾器只是壓縮請求響應至瀏覽器的內容,我們目前的需求是解壓縮接收的數據。這不是我們想要的。

幸運的是,在flask中有一個擴展叫flask-inflate,安裝了此擴展會自動對請求來的數據做解壓操作。查看該擴展的具體代碼處理:

# flask_inflate.py
import gzip
from flask import request

GZIP_CONTENT_ENCODING = 'gzip'


class Inflate(object):
  def __init__(self, app=None):
    if app is not None:
      self.init_app(app)

  @staticmethod
  def init_app(app):
    app.before_request(_inflate_gzipped_content)


def inflate(func):
  """
  A decorator to inflate content of a single view function
  """
  def wrapper(*args, **kwargs):
    _inflate_gzipped_content()
    return func(*args, **kwargs)

  return wrapper


def _inflate_gzipped_content():
  content_encoding = getattr(request, 'content_encoding', None)

  if content_encoding != GZIP_CONTENT_ENCODING:
    return

  # We don't want to read the whole stream at this point.
  # Setting request.environ['wsgi.input'] to the gzipped stream is also not an option because
  # when the request is not chunked, flask's get_data will return a limited stream containing the gzip stream
  # and will limit the gzip stream to the compressed length. This is not good, as we want to read the
  # uncompressed stream, which is obviously longer.
  request.stream = gzip.GzipFile(fileobj=request.stream)

上述代碼的核心是:

 request.stream = gzip.GzipFile(fileobj=request.stream)

于是,在django中可以如下處理:

class XXDataPushView(APIView):
  """
  接收xx數據推送
  """
		# ...
  @white_list_required
  def post(self, request, **kwargs):
    content_encoding = request.META.get("HTTP_CONTENT_ENCODING", "")
    if content_encoding != "gzip":
      req_data = request.data or {}
    else:
      gzip_f = gzip.GzipFile(fileobj=request.stream)
      data = gzip_f.read().decode(encoding="utf-8")
      req_data = json.loads(data)
    # ... handle req_data

ok, 問題完美解決。還可以用如下方式測試請求:

import gzip
import requests
import json

data = {}

data = json.dumps(data).encode("utf-8")
data = gzip.compress(data)

resp = requests.post("http://localhost:8760/push_data/",data=data,headers={"Content-Encoding": "gzip", "Content-Type":"application/json;charset=utf-8"})

print(resp.json())

以上就是如何用Django處理gzip數據流的詳細內容,更多關于Django處理gzip數據流的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Django url 路由匹配過程詳解
  • python基于爬蟲+django,打造個性化API接口
  • 詳解Django關于StreamingHttpResponse與FileResponse文件下載的最優方法
  • Django 實現圖片上傳和下載功能
  • Django前后端分離csrf token獲取方式
  • django中ImageField的使用詳解
  • Django用內置方法實現簡單搜索功能的方法
  • 用ldap作為django后端用戶登錄驗證的實現
  • 詳解Django自定義圖片和文件上傳路徑(upload_to)的2種方式
  • Django數據統計功能count()的使用
  • Django REST Framework 分頁(Pagination)詳解

標簽:重慶 河池 東莞 長春 廊坊 德宏 漢中 臨汾

巨人網絡通訊聲明:本文標題《如何用Django處理gzip數據流》,本文關鍵詞  如,何用,Django,處理,gzip,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《如何用Django處理gzip數據流》相關的同類信息!
  • 本頁收集關于如何用Django處理gzip數據流的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美视频一区二区三区在线观看 | 免费高清不卡av| 91国产成人在线| 丝瓜av网站精品一区二区| 99久久久久免费精品国产| 欧美日韩精品电影| 粉嫩aⅴ一区二区三区四区| 欧美日韩一区三区| 色诱视频网站一区| 亚洲欧美日韩国产综合在线| 亚洲成a人片综合在线| 色婷婷综合久久久久中文 | 日韩久久一区二区| 91最新地址在线播放| 亚洲图片欧美色图| 中文字幕日韩精品一区| 91色在线porny| 国产自产2019最新不卡| 亚洲视频资源在线| 欧美体内she精视频| 国产综合色产在线精品| 亚洲免费三区一区二区| 欧美亚洲国产怡红院影院| 中文字幕一区二区三区乱码在线| 国产xxx精品视频大全| 亚洲天堂网中文字| 宅男在线国产精品| 国产精品自拍av| 亚洲国产精品人人做人人爽| 日韩一区二区麻豆国产| 国产一区免费电影| 国产不卡在线视频| 欧美精品乱码久久久久久| 国产黑丝在线一区二区三区| 日韩欧美一级特黄在线播放| 亚洲激情第一区| 精品免费国产一区二区三区四区| 粉嫩av一区二区三区粉嫩| 国产精品色在线| 久久综合久色欧美综合狠狠| 欧美日韩国产成人在线91 | 91精品国产综合久久婷婷香蕉 | 日韩一区二区电影网| 一本到不卡精品视频在线观看| 精品一区二区免费| 蜜臀久久99精品久久久久宅男| 亚洲一区二区四区蜜桃| 亚洲欧美电影院| 欧美tickling网站挠脚心| 欧美片在线播放| 国产成人在线看| 国产91精品一区二区麻豆网站| 国产大陆a不卡| 日韩亚洲欧美一区二区三区| 99v久久综合狠狠综合久久| 亚洲h在线观看| 亚洲国产精品综合小说图片区| 国产精品久久久久久一区二区三区 | 国产中文字幕精品| 精品理论电影在线| 在线不卡一区二区| 欧美猛男超大videosgay| 日本韩国欧美一区| 在线视频你懂得一区| av在线这里只有精品| 成人av免费在线| 亚洲欧美日韩中文播放| 亚洲精品久久久久久国产精华液 | 91福利在线看| 国产精品77777竹菊影视小说| 国产一区在线观看麻豆| 欧美一区二区网站| 欧美一区二区在线播放| 日韩写真欧美这视频| 精品美女一区二区三区| 欧美韩国日本综合| 看片的网站亚洲| 成人午夜私人影院| 日韩欧美国产系列| 国产日韩欧美在线一区| 日本人妖一区二区| 99久久久国产精品免费蜜臀| 成人精品一区二区三区四区| 日韩免费成人网| 亚洲欧洲精品一区二区三区不卡| 精品一区二区在线播放| 99久久国产综合精品色伊| ww久久中文字幕| 亚洲综合激情另类小说区| 久久99久国产精品黄毛片色诱| 欧美亚洲综合网| 国产亚洲精久久久久久| 亚洲福利一区二区| 东方aⅴ免费观看久久av| 欧美日韩国产在线播放网站| 久久精品一区二区三区不卡| 亚洲一区二区精品3399| 国产高清成人在线| 欧美精品在线一区二区三区| 国产精品久久国产精麻豆99网站| 成人毛片在线观看| 欧美绝品在线观看成人午夜影视| 国产精品色呦呦| 国产自产视频一区二区三区| 欧美无砖砖区免费| 国产精品午夜在线观看| 蜜臀精品一区二区三区在线观看| 色又黄又爽网站www久久| 久久久久国产成人精品亚洲午夜 | 精品日韩成人av| 亚洲欧美成人一区二区三区| 国产高清一区日本| 久久综合九色综合欧美就去吻| 日韩精品久久理论片| 欧美综合天天夜夜久久| 亚洲国产成人自拍| 国产精品一品二品| 国产清纯白嫩初高生在线观看91 | 久久嫩草精品久久久久| 日韩成人一区二区| 日本一区二区三区在线不卡| 国产成人在线观看免费网站| 亚洲精品一区二区三区精华液 | k8久久久一区二区三区| 国产拍揄自揄精品视频麻豆| av成人免费在线| 亚洲私人黄色宅男| 色菇凉天天综合网| 麻豆免费精品视频| 日韩欧美成人激情| 国产自产v一区二区三区c| 亚洲视频在线一区| 一本色道**综合亚洲精品蜜桃冫| 日韩黄色一级片| 欧美成人精品1314www| 午夜私人影院久久久久| 欧美精品一区二区三区一线天视频| 美腿丝袜亚洲色图| 国产精品国产三级国产aⅴ中文| 成a人片亚洲日本久久| 中文字幕亚洲一区二区va在线| 在线观看www91| 日韩av中文字幕一区二区三区| 欧美综合在线视频| 国产成人精品aa毛片| 中文字幕在线播放不卡一区| 337p亚洲精品色噜噜噜| 国产资源精品在线观看| 日韩亚洲电影在线| 一本色道久久综合精品竹菊 | 国产亚洲欧美一区在线观看| 懂色av一区二区三区免费看| 青青青爽久久午夜综合久久午夜| 精品久久久久久无| 国产99精品国产| 午夜不卡在线视频| 久久人人爽人人爽| 91精品国产综合久久婷婷香蕉 | 国产一区不卡精品| 日韩高清国产一区在线| 久久综合av免费| 成人午夜在线播放| 麻豆freexxxx性91精品| 日韩一区二区在线播放| 色视频成人在线观看免| 蜜臀久久久久久久| 亚洲一二三四久久| 精品国产sm最大网站免费看| 欧美麻豆精品久久久久久| 国产成人精品在线看| 国产精品久久毛片av大全日韩| 精品少妇一区二区三区日产乱码| 9l国产精品久久久久麻豆| 日韩av午夜在线观看| **性色生活片久久毛片| 日韩一区二区在线观看视频播放| 97超碰欧美中文字幕| 激情五月婷婷综合网| 1000部国产精品成人观看| 亚洲欧美电影一区二区| 久久先锋影音av鲁色资源| 日韩精品一区二区三区老鸭窝| 99久久精品国产精品久久| 成人国产精品免费观看| 国产综合色在线视频区| 人人爽香蕉精品| 亚洲国产成人av网| 亚洲图片欧美激情| 国产精品不卡在线| 欧美一区二区三区在线看| 日本久久电影网| 在线视频一区二区三区| 国产成人久久精品77777最新版本| 日本中文字幕不卡| 国产清纯白嫩初高生在线观看91 | 在线观看国产日韩| 国产一区福利在线| 欧美三级蜜桃2在线观看| 成人av在线一区二区| 性感美女久久精品|