6

次のコードを使用して、Python 3.2.3 で urllib.request との HTTP 接続を維持しようとしています。

handler = urllib.request.HTTPHandler()
opener = urllib.request.build_opener(handler)
opener.addheaders = [("connection", "keep-alive"), ("Cookie", cookie_value)]
r = opener.open(url)

しかし、Wireshark との接続をリッスンすると、「接続: 閉じられました」というヘッダーが表示されますが、Cookie が設定されます。

Host: url
Cookie: cookie-value
Connection: close

Headerinfo を Connection: keep-alive に設定するにはどうすればよいですか?

4

2 に答える 2

1

使用することで接続を維持しますhttp-client

import http.client
conn = http.client.HTTPConnection(host, port)
conn.request(method, url, body, headers)

ヘッダーは dict を与えるだけで、ボディはまだ使用できますurllib.parse.urlencode。そのため、HTTP クライアントで Cookie ヘッダーを作成できます。

参考:
公式参考

于 2013-11-09T03:59:10.603 に答える
1

単純な http.client よりも自動化されたものが必要な場合は、これが役立つかもしれませんが、スレッドセーフではありません。

from http.client import HTTPConnection, HTTPSConnection
import select
connections = {}


def request(method, url, body=None, headers={}, **kwargs):
    scheme, _, host, path = url.split('/', 3)
    h = connections.get((scheme, host))
    if h and select.select([h.sock], [], [], 0)[0]:
        h.close()
        h = None
    if not h:
        Connection = HTTPConnection if scheme == 'http:' else HTTPSConnection
        h = connections[(scheme, host)] = Connection(host, **kwargs)
    h.request(method, '/' + path, body, headers)
    return h.getresponse()


def urlopen(url, data=None, *args, **kwargs):
    resp = request('POST' if data else 'GET', url, data, *args, **kwargs)
    assert resp.status < 400, (resp.status, resp.reason, resp.read())
    return resp
于 2014-11-23T15:00:56.377 に答える