V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
charley
V2EX  ›  Python

Requests gzip 压缩问题

  •  
  •   charley · 2017-04-23 14:43:43 +08:00 via iPhone · 5205 次点击
    这是一个创建于 2771 天前的主题,其中的信息可能已经有所发展或是发生改变。
    requests 在请求的时候会自动使用 gizp 压缩,因为请求服务器不支持 gzip 怎么取消 gzip 压缩?
    19 条回复    2017-04-24 21:24:32 +08:00
    firefox12
        1
    firefox12  
       2017-04-23 14:51:16 +08:00 via iPhone   ❤️ 1
    服务器不支持, response 的时候就是原始数据 客户端就自动使用原始数据。
    iyaozhen
        2
    iyaozhen  
       2017-04-23 16:33:22 +08:00 via Android
    一楼正解。只要服务端正规来, response header 不申明 gzip 压缩客户端就不会解压缩
    charley
        3
    charley  
    OP
       2017-04-23 17:13:25 +08:00 via iPhone
    是 requests 发送数据到服务器的时候压缩了,服务器识别不了,直接返回错误了
    charley
        4
    charley  
    OP
       2017-04-23 17:14:12 +08:00 via iPhone
    使用的是 post
    julyclyde
        5
    julyclyde  
       2017-04-23 18:15:20 +08:00
    楼上几位是不是没理解?
    提问者说的 requests 是一个库的名字,而不是和 response 对应的那个词
    raptium
        6
    raptium  
       2017-04-23 18:32:53 +08:00 via iPhone
    好像没听说过 HTTP 请求能压缩的……
    neoblackcap
        7
    neoblackcap  
       2017-04-23 18:37:44 +08:00
    @julyclyde 楼上几位都没有错,你理解错了。客户端就是在这里就是指 requests 这个库, http 报文没有说用 gzip 那么 requests 就不会用 gzip 解压,会使用原始报文。上面几楼解释得相当浅白了。
    至于 post 不接受 gzip, 此为一个解决方法可以参考 https://github.com/kennethreitz/requests/issues/1753
    firefox12
        8
    firefox12  
       2017-04-23 18:40:37 +08:00 via iPhone
    正常理解当然是 他用了 requests 库去请求 请求头里支持 gzip ,而服务器不支持 gzip 压缩,只能以原始数据回复。这并不影响使用


    如果 client 希望 request 的 body 使用 gzip ,这个应该是非标准的。这也是为什么服务器会不支持。
    lxy
        9
    lxy  
       2017-04-23 18:52:55 +08:00
    requests 本身默认 post 数据不会使用 gzip 进行压缩
    just1
        10
    just1  
       2017-04-23 19:32:39 +08:00 via Android
    标准的返回会标识是否 gzip , reqiests 会根据这个标识来处理(是否 gzip 解压)
    charley
        11
    charley  
    OP
       2017-04-23 20:39:37 +08:00 via iPhone
    谢谢各位回答,我是初学 python 的,我感觉是不是我哪里弄错了
    julyclyde
        12
    julyclyde  
       2017-04-23 21:06:29 +08:00
    @raptium 关于请求是否能压缩,前几年我还特地读过标准,是可以的,不过当年的 nginx 不支持……
    julyclyde
        13
    julyclyde  
       2017-04-23 21:07:18 +08:00
    @neoblackcap 你说的“ http 报文没有说用 gzip ”是什么?请用标准术语描述一遍
    neoblackcap
        14
    neoblackcap  
       2017-04-23 21:20:07 +08:00
    @julyclyde http 头部中的 Accept-Encoding 不带 gzip
    neoblackcap
        15
    neoblackcap  
       2017-04-23 21:28:15 +08:00
    @julyclyde 上面说错了, requests 是根据 http 头部的 Content-Encoding 或者 Transfer-Encoding 来决定是否启用 gzip 。但是楼主现在不是这个情况,他是发送请求给服务器,服务器不支持 gzip 压缩,但是 requests 发出 POST 请求的时候却会自动启用 gzip 。
    julyclyde
        16
    julyclyde  
       2017-04-23 21:40:48 +08:00
    这样吧,我来用规范的语言表达一下我的意思
    1 从标准的角度来说, HTTP 请求的 POST body 可以是压缩的(当然需要同时在 header 里声明)。但考虑到 HTTP 是一个先请求后响应的协议,服务器没办法提前声明自己的能力,所以正经客户端都不会发压缩的 POST 请求。我之前只遇到过某 android 模拟器会发压缩的
    2 很多服务器不认识压缩的 POST body ,也没有义务认识
    3 经过试验和阅读代码,我确认 python 的 requests 库在不指定的情况下,不会用压缩的方式发送 POST 请求
    4 尝试了给 requests.post 增加 Content-Encoding:gzip 的 header ,但发出去的请求依然是原文
    所以还是请 lz 先确认一下自己的问题是不是正确
    julyclyde
        17
    julyclyde  
       2017-04-23 21:41:34 +08:00
    @neoblackcap 我试过了,加这个 header 并不会使 requests 把需要 post 的数据先压缩了再发
    julyclyde
        18
    julyclyde  
       2017-04-23 21:43:02 +08:00
    @neoblackcap Accept-Encoding 是客户端向服务器声明自己是否支持压缩用的,和 post body 没什么关系
    mingyun
        19
    mingyun  
       2017-04-24 21:24:32 +08:00
    @julyclyde nice
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   917 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 21:28 · PVG 05:28 · LAX 13:28 · JFK 16:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.