from flask import request, current_app, url_for from urllib.parse import urlsplit, urlunsplit def prefixed_url_for(endpoint, **values): prefix = request.headers.get('X-Forwarded-Prefix', '') scheme = request.headers.get('X-Forwarded-Proto', request.scheme) host = request.headers.get('Host', request.host) external = values.pop('_external', False) generated_url = url_for(endpoint, **values) if external: path, query, fragment = urlsplit(generated_url)[2:5] # Check if the prefix is already present in the path if prefix and not path.startswith(prefix): new_path = prefix + path else: new_path = path return urlunsplit((scheme, host, new_path, query, fragment)) else: # Check if the prefix is already present in the generated URL if prefix and not generated_url.startswith(prefix): return prefix + generated_url else: return generated_url