Updated answer
The answer below concerns versions below 2.9.2. Since version 2.9.2 (around April 2016) using an OrderedDict
works again.
Old answer
It looks like it was possible some time ago using just the built-in functionality (issue 179). I think it is not anymore (issue 2057) and one of the reasons is mentioned in another comment by num1. I have used a following solution/workaround.
import requests
import collections
class SortedHTTPAdapter(requests.adapters.HTTPAdapter):
def add_headers(self, request, **kwargs):
request.headers = collections.OrderedDict(
((key, value) for key, value in sorted(request.headers.items()))
)
session = requests.Session()
session.mount("http://", SortedHTTPAdapter())
In the example headers are just sorted but one can order them in any way. I chose that method after going through requests
code and reading the method's docstring:
Add any headers needed by the connection. As of v2.0 this does nothing
by default, but is left for overriding by users that subclass the
HTTPAdapter <requests.adapters.HTTPAdapter>
class.
For absolute control one could override the send
method probably.
The order in which header fields with differing field names are received is not significant.
Requiring a specific order for headers isn't just inconvenient, it's incorrect. – Seating