PycURL Requests is a Requests-compatible interface for PycURL.
Latest release via pip:
pip install pycurl-requests [--user]via Git:
git clone https://github.com/dcoles/pycurl-requests.git; cd pycurl-requests python3 setup.py install [--user]>>> import pycurl_requests as requests >>> r = requests.get('https://api.github.com/repos/dcoles/pycurl-requests') >>> r.status_code 200 >>> r.headers['content-type'] 'application/json; charset=utf-8' >>> r.encoding 'utf-8' >>> r.text '{\n "id": 236427187,\n...' >>> data = r.json() >>> data['name'] 'pycurl-requests' >>> data['html_url'] 'https://github.com/dcoles/pycurl-requests' >>> data['description'] 'A Requests-compatible interface for pycURL'The library can also be used to run existing Python scripts that import the requests module. By running the script through the pycurl_requests helper, any use of the requests module will be automatically redirected to pycurl_requests.
python3 -m pycurl_requests -- script.py arg arg...A basic curl-like command-line utility is included:
usage: request.py [-h] [-d DATA] [-H HEADER] [--json JSON] [-L] [-o OUTPUT] [-X REQUEST] [-v] url A basic `curl`-like command-line HTTP utility positional arguments: url URL of resource to connect to optional arguments: -h, --help show this help message and exit -d DATA, --data DATA Add POST data -H HEADER, --header HEADER Add custom request header (format: `Header: Value`) --json JSON Add JSON POST data -L, --location Follow redirects -o OUTPUT, --output OUTPUT Write to file instead of stdout -X REQUEST, --request REQUEST Request command to use (e.g. HTTP method) -v, --verbose Verbose logging This can also be used with the Requests library if PYCURLREQUESTS_REQUESTS environment variable is set to a non-null value.
This library aims to be API compatible with Requests, thus the Requests documentation should be mostly applicable.
PycURL support is implemented as a transport adapter. This means it's possible to use PycURL with the Requests library itself!
import pycurl import requests from pycurl_requests.adapters import PyCurlHttpAdapter with requests.Session() as session: curl = pycurl.Curl() session.mount('https://', PyCurlHttpAdapter(curl)) session.mount('http://', PyCurlHttpAdapter(curl)) response = session.get('http://example.com')It is possible customize cURL's behaviour using the curl attribute on a Session object.
For example, to make a request without requesting the body:
import pycurl import pycurl_requests as requests with requests.Session() as session: session.curl.setopt(pycurl.NOBODY, 1) response = session.get('http://example.com')See the pycurl.Curl object documentation for all possible curl attribute methods.
All pycurl.error exceptions are mapped to a requests.RequestException (or one of its subclasses).
For convenience, the original pycurl.error error message and cURL error code will be set on the exception object as the curl_message and curl_code attributes.
import pycurl_requests as requests try: requests.get('http://connect_error') except requests.RequestException as e: print('ERROR: {} (cURL error: {})'.format(e.curl_message, e.curl_code))It is also possible to obtain the original pycurl.error using the __cause__ attribute.
Detailed log records from libcurl, including informational text and HTTP headers, can be shown by setting the curl logger (or sub-loggers) to DEBUG level:
import logging logging.getLogger('curl').setLevel(logging.DEBUG)Log records are split into dedicated sub-loggers for each type of record:
curl.text— Informational textcurl.header_in— Header data received from the peercurl.header_out— Header data sent to the peer
- No support for reading Cookies
- No support for client-side certificates
- No support for proxies
- No support for link headers (e.g.
Response.links) - No support for sending multi-part encoded files
- Basic support for
Sessionobjects (e.g.requests.Session)
Licensed under the MIT License.