A library for deciding content-type based on media ranges in HTTP Accept headers.
Project description
content-negotiation
A small Python library supporting content-negotiation.
It is used to decide content type based on a list of media ranges in the accept header, as well as deciding content-language based on the accept-language header.
- Media ranges/language ranges with a q-value of 0.0 will be ignored.
- Q-values above 1.0 will be treated as 1.0. Q-values below 0.0 will be treated as 0.0.
- When a media range is not specified, it will be treated as
*/*
. - When a language range is not specified, it will be treated as
*
. - When media ranges and language ranges are equal, the first one will be returned.
For more information on the accept header, see RFC 7231, section-5.3.2. For more information on the accept-language header, see RFC 7231, section-5.3.5
Usage
Install
% pip install content-negotiation
Getting started
Content type
from content_negotiation import decide_content_type, NoAgreeableContentTypeError
accept_headers = ["application/json", "text/html", "text/plain, text/*;q=0.8"]
supported_content_types = ["text/turtle", "application/json"]
try:
content_type = decide_content_type(accept_headers, supported_content_types)
except NoAgreeableContentTypeError:
print("No agreeable content type found.")
# Handle error, by returning e.g. 406 Not Acceptable
Content language
from content_negotiation import decide_content_language, NoAgreeableContentLanguageError
accept_language_headers = ["en-GB;q=0.8", "nb-NO;q=0.9"]
supported_languages = ["en-GB", "en", "nb-NO", "nb", "en-US"]
try:
content_language = decide_decide_language(accept_language_headers, supported_languages)
except NoAgreeableLanguageError:
print("No agreeable language found.")
# Handle error, by returning e.g. 406 Not Acceptable
Development
Requirements
% pipx install poetry==1.2.0
% pipx install nox==2022.8.7
% pipx inject nox nox-poetry==1.0.1
Install developer tools
% git clone https://github.com/Informasjonsforvaltning/content-negotiation.git
% cd content-negotiation
% pyenv install 3.8.13
% pyenv install 3.9.13
% pyenv install 3.10.6
% pyenv local 3.8.13 3.9.13 3.10.6
% poetry install
Run all sessions
% nox
Run all tests with coverage reporting
% nox -rs tests
Debugging
You can enter into Pdb by passing --pdb
to pytest:
% nox -rs tests -- --pdb --log-cli-level=DEBUG
You can set breakpoints directly in code by using the function breakpoint()
.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
content-negotiation-1.1.2.tar.gz
(10.4 kB
view hashes)
Built Distribution
Close
Hashes for content-negotiation-1.1.2.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 561ed5cae065b3754dc686c71a8721a2d4ca704b9ce7fdc876f8048a5db1a70f |
|
MD5 | 0463f07ee97397a31997780a2355f56f |
|
BLAKE2b-256 | d803f7de5b932ca2b4ccb5f500f26f24931539679c8fce10a6d85198d8f037e3 |
Close
Hashes for content_negotiation-1.1.2-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b7afdcf385ee82444ff44be5a73f724990a02477844a54b722fdb7787ed13635 |
|
MD5 | 2ebeb715bbc92f6d6397570bf8f82ac1 |
|
BLAKE2b-256 | 4fc5d20eb43e7336af49502f41734b6533cd9f2a0cc82246c1f7afc40869ad91 |