电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

如何用Django處理gzip數據流

瀏覽:156日期: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
相關文章:
主站蜘蛛池模板: 幂简集成 - 品种超全的API接口平台, 一站搜索、试用、集成国内外API接口 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | 粘弹体防腐胶带,聚丙烯防腐胶带-全民塑胶 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 高压微雾加湿器_工业加湿器_温室喷雾-昌润空气净化设备 | 不锈钢发酵罐_水果酒发酵罐_谷物发酵罐_山东誉诚不锈钢制品有限公司 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 亮化工程,亮化设计,城市亮化工程,亮化资质合作,长沙亮化照明,杰奥思【官网】 | 磁力链接搜索神器_BT磁力狗_CILIMAO磁力猫_高效磁力搜索引擎2024 | 山东臭氧发生器,臭氧发生器厂家-山东瑞华环保设备 | 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 直流大电流电源,燃料电池检漏设备-上海政飞| 注浆压力变送器-高温熔体传感器-矿用压力传感器|ZHYQ朝辉 | 冷油器-冷油器换管改造-连云港灵动列管式冷油器生产厂家 | 依维柯自动挡房车,自行式国产改装房车,小型房车价格,中国十大房车品牌_南京拓锐斯特房车 - 南京拓锐斯特房车 | 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 模具ERP_模具管理系统_模具mes_模具进度管理_东莞市精纬软件有限公司 | 阿里巴巴诚信通温州、台州、宁波、嘉兴授权渠道商-浙江联欣科技提供阿里会员办理 | 北京模型公司-军事模型-工业模型制作-北京百艺模型沙盘公司 | 进口试验机价格-进口生物材料试验机-西安卡夫曼测控技术有限公司 | 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | 家用净水器代理批发加盟_净水机招商代理_全屋净水器定制品牌_【劳伦斯官网】 | 酵素生产厂家_酵素OEM_酵素加盟_酵素ODM_酵素原料厂家_厦门益力康 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 医学动画公司-制作3d医学动画视频-医疗医学演示动画制作-医学三维动画制作公司 | 创绿家招商加盟网-除甲醛加盟-甲醛治理加盟-室内除甲醛加盟-创绿家招商官网 | 穿线管|波纹穿线管|包塑金属软管|蛇皮管?闵彬专注弱电工程? | 齿轮减速机电机一体机_齿轮减速箱加电机一体化-德国BOSERL蜗轮蜗杆减速机电机生产厂家 | 北京律师事务所_房屋拆迁律师_24小时免费法律咨询_云合专业律师网 | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | 橡胶接头_橡胶软接头_套管伸缩器_管道伸缩器厂家-巩义市远大供水材料有限公司 | 铝箔袋,铝箔袋厂家,东莞铝箔袋,防静电铝箔袋,防静电屏蔽袋,防静电真空袋,真空袋-东莞铭晋让您的产品与众不同 | 涂层测厚仪_漆膜仪_光学透过率仪_十大创新厂家-果欧电子科技公司 | 济南侦探调查-济南调查取证-山东私家侦探-山东白豹调查咨询公司 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 挨踢网-大家的导航! | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 |