成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

如何用Django處理gzip數據流

瀏覽:220日期:2024-09-13 17:51:13

最近在工作中遇到一個需求,就是要開一個接口來接收供應商推送的數據。項目采用的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, FutureCallback<HttpResponse> 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, FutureCallback<HttpResponse> callback) { HttpUriRequest request = requestBuilder.build(); httpClient.execute(request, new FutureCallback<HttpResponse>() { @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.pyimport gzipfrom flask import requestGZIP_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 wrapperdef _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 gzipimport requestsimport jsondata = {}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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲免费毛片网站| 麻豆国产91在线播放| 亚洲第一福利视频在线| 亚洲精品九九| 亚洲国产精品成人久久综合一区| 99视频在线精品| 欧美成人三级在线| 国产成人精品一区二| 在线一区二区三区做爰视频网站| 亚洲一二三区视频在线观看| 亚洲激情偷拍| 亚洲色图一区二区三区| 亚洲天堂成人| 国产精品另类一区| 欧美a级片一区| 国产精品丝袜一区| 欧美色123| 欧美国产1区2区| 亚洲欧美一区二区原创| 国产欧美日韩另类一区| 欧美+日本+国产+在线a∨观看| 久久嫩草精品久久久精品一| 色综合天天综合色综合av| 久久综合狠狠综合久久综合88 | 亚洲一区二区三区爽爽爽爽爽| 亚洲第一毛片| 亚洲精品亚洲人成人网 | 日韩欧美国产高清| 成人av在线播放网站| 精品999在线播放| 女人天堂亚洲aⅴ在线观看| 中文av字幕一区| 影音先锋久久资源网| 亚洲视频在线一区| 亚洲欧美日韩精品在线| 亚洲一区二区精品3399| 亚洲欧美久久久| 丝袜美腿亚洲综合| 欧美午夜电影在线播放| 精品一区二区三区免费| 欧美一区二区三区视频在线观看| 国产成人小视频| 欧美精品一区二区三区四区| 欧美不卡高清| 亚洲欧美激情小说另类| 免费精品视频| 人人狠狠综合久久亚洲| 91精品国产综合久久婷婷香蕉| 成人午夜大片免费观看| 久久综合99re88久久爱| 狠色狠色综合久久| 亚洲一区二区三区四区在线免费观看 | 粉嫩高潮美女一区二区三区| 欧美精品一区二区三区在线播放| 国产精品igao视频网网址不卡日韩| 国产精品美女久久久久久久网站| 国产日韩三区| 美洲天堂一区二卡三卡四卡视频 | 欧美不卡视频| 亚洲激情第一区| 在线看日本不卡| 国产精品18久久久| 中文字幕免费不卡| 国产精品久久777777毛茸茸| 日韩影视精彩在线| 欧美不卡一区二区三区四区| 91免费国产在线| 亚洲一区二区三区在线| 欧美在线不卡视频| 成人av在线资源网| 成人免费在线播放视频| 久久都是精品| 国产福利一区二区三区视频 | 波多野结衣在线一区| 国产精品卡一卡二卡三| 老鸭窝毛片一区二区三区| 国内久久精品视频| 国产亚洲婷婷免费| 午夜亚洲性色福利视频| 国产精品91xxx| 亚洲欧洲精品一区二区精品久久久 | 色综合天天综合网天天看片| 亚洲一区二区在线视频| 制服丝袜中文字幕一区| 欧美喷水视频| 香蕉成人伊视频在线观看| 欧美一区二区三区视频在线| 伊甸园精品99久久久久久| 秋霞国产午夜精品免费视频| 精品对白一区国产伦| 国产精品久久久一区二区| 国产精品一区二区三区乱码| 亚洲手机成人高清视频| 欧美日韩1区2区| 欧美日韩精品伦理作品在线免费观看| 亚洲3atv精品一区二区三区| 欧美精品一区男女天堂| 美玉足脚交一区二区三区图片| 国产91对白在线观看九色| 亚洲乱码一区二区三区在线观看| 欧美日韩综合色| 亚洲高清视频一区二区| 国产很黄免费观看久久| 亚洲在线观看免费| 久久亚洲欧美国产精品乐播| 久久久777| 97se亚洲国产综合自在线不卡| 五月综合激情婷婷六月色窝| 精品国内二区三区| 久久久久国产精品一区三寸| 色综合一个色综合亚洲| 精品系列免费在线观看| 樱桃视频在线观看一区| 欧美成人一区二区三区| 久久一区国产| 国内精品嫩模av私拍在线观看| 韩国午夜理伦三级不卡影院| 一区二区三区日韩在线观看| 久久久亚洲欧洲日产国码αv| 色婷婷激情一区二区三区| 欧美日韩一区二区三区四区在线观看 | 国产伦精品一区二区三区照片91 | 91麻豆精品国产91久久久| 一本色道久久精品| 99久久综合99久久综合网站| 免费xxxx性欧美18vr| 亚洲欧洲色图综合| xfplay精品久久| 欧美猛男gaygay网站| 国产精品一区在线观看| 欧美激情性爽国产精品17p| 国产福利一区在线| 日本成人在线网站| 一二三四区精品视频| 国产精品欧美综合在线| 欧美一区二区二区| 欧美熟乱第一页| 男人的天堂亚洲| 激情欧美国产欧美| 欧美va天堂在线| 成人久久久精品乱码一区二区三区| 麻豆成人免费电影| 午夜伦欧美伦电影理论片| 一区二区中文视频| 国产亚洲精品免费| 精品电影一区二区三区| 欧美福利视频一区| 欧美日韩激情在线| 在线视频欧美精品| 久久一区精品| 香蕉久久夜色| 在线视频精品一区| 伊人久久婷婷色综合98网| 成人av网址在线| 国产成人精品三级麻豆| 国产揄拍国内精品对白| 麻豆一区二区三| 亚洲大尺度视频在线观看| 亚洲色图制服诱惑| 中文字幕av不卡| 国产午夜精品久久久久久免费视| 精品国产青草久久久久福利| 制服视频三区第一页精品| 欧美性xxxxxx少妇| 色悠悠亚洲一区二区| 久久一日本道色综合久久| 亚洲一区二区在线看| 亚洲激情国产| 欧美精品三区| 韩国精品一区二区三区| 欧美激情aⅴ一区二区三区| 91蜜桃视频在线| 欧美在线亚洲| 91小视频在线免费看| 99riav久久精品riav| 91一区二区三区在线观看| 99精品黄色片免费大全| 99国内精品久久| 色综合久久中文综合久久牛| 91色视频在线| 欧美精品成人| 国产在线观看一区| 激情自拍一区| 99精品国产一区二区青青牛奶| 999在线观看精品免费不卡网站| 亚洲经典三级| 国产欧美一级| 久久成人精品| 久久精品电影| 日本精品视频一区二区三区| 欧美专区亚洲专区| 在线电影国产精品| 日韩欧美的一区| 久久久亚洲精华液精华液精华液| 久久久亚洲综合| 国产精品久久久久久久裸模 | 日韩一区二区三区免费观看| 日韩精品一区二区在线观看| 国产亚洲欧美日韩日本| 日韩一区在线免费观看|