So I first use requests.head() to download the header. I do some validation(check the status code, check content-type) if that is good I download the body. However I use requests.get() to that, but using .get() not only downloads the body but also the header which I just downloaded. So I don't need to download the header twice, anyway I can download the body of a get response if the header looks good?
Ask only the header in case of a 404 or 302 is non sense. Either you get the error and the cost is the same as directly asking the body, or you get no error and need a second request for the body.
So unless the body is really large I would directly ask for the body with a single request. And if it is large, but tranferred in chunked mode, you can read the header with the first chunk and abort the transfert if it has a wrong content-type.
HTTP HEAD request do not have common usages, and what you describe does not really looks like one. They are normally only used when you only need the header and will never use the body.
Python requests: Anyway to download just the body of a get response?