首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止python异步http请求中的响应体下载

防止python异步http请求中的响应体下载
EN

Stack Overflow用户
提问于 2017-03-23 02:34:41
回答 2查看 1K关注 0票数 6

我想要"ping“一个服务器,检查标题响应,看看链接是否坏了,如果它没有损坏,实际上下载响应正文。

传统上,使用requests模块的同步方法,您可以发送带有stream = True参数的get请求,并在响应体下载之前捕获标头,如果出现错误(例如,找不到),则决定中止连接。

我的问题是,用异步库grequestsrequests-futures来实现这一点对于我减少的知识基础来说已经变得不可能了。

我尝试过在request-futures中将流参数设置为true,但是没有用,它仍然下载响应体,而不让我一得到响应头就介入。即使是这样,我也不知道该怎么做。

这就是我尝试过的:

test.py

代码语言:javascript
复制
from requests_futures.sessions import FuturesSession

session = FuturesSession()
session.stream = True

future = session.get('http://www.google.com')
response = future.result()
print(response.status_code) # Here I would assume the response body hasn't been loaded

调试后,我发现它以任何方式下载响应体。

我希望有任何办法解决最初的问题,无论它是否符合我的逻辑。

EN

回答 2

Stack Overflow用户

发布于 2017-03-29 05:01:17

我相信您想要的是HTTP头请求:

代码语言:javascript
复制
session.head('http://www.google.com')

根据w3.org,“HEAD方法与GET相同,只是服务器不能在响应中返回消息体。”如果您喜欢状态代码和标头,您可以使用普通的GET请求进行跟踪。

对于注释,您可能也对在单个请求中执行此操作感兴趣。可以通过套接字直接这样做。发送普通的GET请求,对第一个块执行recv,如果您不喜欢结果,关闭连接,否则在剩余的块上循环。

以下是关于如何使用单个请求有条件地下载的概念的证明:

代码语言:javascript
复制
import socket

def fetch_on_header_condition(host, resource, condition, port=80):
    request =  'GET %s HTTP/1.1\r\n' % resource
    request += 'Host: %s\r\n' % host
    request += 'Connection: close\r\n'
    request += '\r\n'

    s = socket.socket()
    try:
        s.connect((host, port))
        s.send(request)
        first_block = s.recv(4096)
        if not condition(first_block):
            return False, ''
        blocks = [first_block]
        while True:
            block = s.recv(4096)
            if not block:
                break
            blocks.append(block)
        return True, ''.join(blocks)
    finally:
        s.close()

if __name__ == '__main__':
    print fetch_on_header_condition(
        host = 'www.jython.org',
        port = 80,
        resource = '/',
        condition = lambda s: 'Content-Type: text/xml' in s,
    )
票数 2
EN

Stack Overflow用户

发布于 2017-03-29 04:57:00

只需检查head请求中的状态,并相应地进行:

代码语言:javascript
复制
header = session.head('https://google.com')

if header.ok is True:
    session.get('https://google.com')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42966224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档