HTTP Clients¶
Python-arango lets you define your own HTTP client for sending requests to ArangoDB server. The default implementation uses the requests library.
Your HTTP client must inherit arango.http.HTTPClient
and implement the
following abstract methods:
The create_session method must return a requests.Session instance per connected host (coordinator). The session objects are stored in the client.
The send_request method must use the session to send an HTTP request, and
return a fully populated instance of arango.response.Response
.
For example, let’s say your HTTP client needs:
- Automatic retries
- Additional HTTP header called
x-my-header
- SSL certificate verification disabled
- Custom logging
Your CustomHTTPClient
class might look something like this:
import logging
from requests.adapters import HTTPAdapter
from requests import Session
from requests.packages.urllib3.util.retry import Retry
from arango.response import Response
from arango.http import HTTPClient
class CustomHTTPClient(HTTPClient):
"""My custom HTTP client with cool features."""
def __init__(self):
# Initialize your logger.
self._logger = logging.getLogger('my_logger')
def create_session(self, host):
session = Session()
# Add request header.
session.headers.update({'x-my-header': 'true'})
# Enable retries.
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504],
method_whitelist=["HEAD", "GET", "OPTIONS"],
)
http_adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount('https://', http_adapter)
session.mount('http://', http_adapter)
return session
def send_request(self,
session,
method,
url,
params=None,
data=None,
headers=None,
auth=None):
# Add your own debug statement.
self._logger.debug(f'Sending request to {url}')
# Send a request.
response = session.request(
method=method,
url=url,
params=params,
data=data,
headers=headers,
auth=auth,
verify=False, # Disable SSL verification
timeout=5 # Use timeout of 5 seconds
)
self._logger.debug(f'Got {response.status_code}')
# Return an instance of arango.response.Response.
return Response(
method=response.request.method,
url=response.url,
headers=response.headers,
status_code=response.status_code,
status_text=response.reason,
raw_body=response.text,
)
Then you would inject your client as follows:
from arango import ArangoClient
from my_module import CustomHTTPClient
client = ArangoClient(
hosts='http://localhost:8529',
http_client=CustomHTTPClient()
)
See requests.Session for more details on how to create and manage sessions.