use signposting package

This commit is contained in:
Daniel Bauer
2024-11-01 13:02:56 +01:00
parent 076273d014
commit 2d3dafbacc
5 changed files with 50 additions and 68 deletions

View File

@@ -1,5 +1,6 @@
from typing import Callable
from django.http import HttpRequest, HttpResponse
from signposting import Signpost
class SignpostingMiddleware:
@@ -21,20 +22,18 @@ class SignpostingMiddleware:
return response
def _add_signposts(self, response: HttpResponse, typed_links: dict[str, list[str|tuple[str, str]]]):
def _add_signposts(self, response: HttpResponse, signposts: list[Signpost]):
""" Adds signposting headers to the respones.
params:
response - the response object
typed_links - a map of relation types to a list of corresponding links. Each link can be a link or a tuple of link and media type.
signposts - a list of Signposts
"""
link_snippets = []
for relation_type in typed_links.keys():
links = typed_links.get(relation_type, [])
for link in links:
if isinstance(link, tuple) and len(link) > 1:
link_snippets.append(f'<{link[0]}> ; rel="{relation_type}" ; type="{link[1]}"')
else:
link_snippets.append(f'<{link}> ; rel="{relation_type}"')
for signpost in signposts:
link_snippets.append(f'<{signpost.target}> ; rel="{signpost.rel}"')
if signpost.type:
link_snippets[-1] += f' ; type="{signpost.type}"'
response["Link"] = " , ".join(link_snippets)

View File

@@ -1,23 +1,17 @@
from django.http import HttpResponse
from signposting import Signpost
def add_signposts(response: HttpResponse, **kwargs):
def add_signposts(response: HttpResponse, *args: Signpost):
""" Adds signposting headers to the responses.
params:
response - the response object
kwargs - a map of relation types to a list of corresponding links. Each link can be a link or a tuple of link and media type.
args - a list of signposts to add to this resposnse.
"""
if not hasattr(response, '_signposts'):
response._signposts = {}
response._signposts = []
for key in kwargs.keys():
values = kwargs[key]
if isinstance(values, str) or isinstance(values, tuple):
values = [values]
if key not in response._signposts:
response._signposts[key] = values
else:
response._signposts[key] += values
for signpost in args:
if not signpost in response._signposts:
response._signposts.append(signpost)