A release-candidate for secure v2.0.0 focused on a cleaner public API, modern presets, first-class ASGI/WSGI middleware, and safer header application/validation across frameworks.
Highlights
- New preset model with a recommended default:
Preset.BALANCED - New ASGI + WSGI middleware for framework-agnostic integration
- New header pipeline helpers for allowlisting, deduping, and validation/normalization
- Expanded header coverage and improved docs, examples, and migration guidance
Breaking changes
- Presets redesigned and defaults changed
- Added
Preset.BALANCED, now the recommended default. Secure.with_default_headers()now equalsSecure.from_preset(Preset.BALANCED).Preset.BASICtargets Helmet.js default parity.Preset.STRICTno longer enables HSTS preload by default (opt-in separately).
- Added
Secure.headersis now strict about duplicates- Duplicate header names (case-insensitive) raise
ValueError. - Use
header_items()for multi-valued emission, or resolve duplicates viadeduplicate_headers()/validate_and_normalize_headers().
- Duplicate header names (case-insensitive) raise
Added
- Middleware
SecureASGIMiddleware(intercepts ASGIhttp.response.start)SecureWSGIMiddleware(wraps WSGIstart_response)secure.middlewarere-exports both; supportsmulti_okfor safely appending multi-valued headers (e.g. CSP)
- Header pipeline helpers on
Secureallowlist_headers(...)(raise/drop/warn)deduplicate_headers(...)(raise,first,last,concat) withCOMMA_JOIN_OKandMULTI_OKvalidate_and_normalize_headers(...)(RFC 7230 token validation, CR/LF hardening, optional obs-text, immutable normalized override)
- Serialization
header_items()for ordered(name, value)output without enforcing uniqueness
- Constants / policies
MULTI_OK,COMMA_JOIN_OK,DEFAULT_ALLOWED_HEADERSOnInvalidPolicy,OnUnexpectedPolicy,DeduplicateAction
- Expanded header coverage
Cross-Origin-Resource-PolicyX-DNS-Prefetch-ControlX-Permitted-Cross-Domain-Policies
- Project & CI
CODE_OF_CONDUCT.md,CONTRIBUTING.md- GitHub Actions for multi-version tests + Ruff
Changed
- Docs/README overhaul
- Middleware usage +
multi_oksemantics - Clear preset guidance (
BALANCED/BASIC/STRICT) and documented default header set - New “header pipeline and validation” section (allowlist → dedupe → normalize)
- New error handling/logging guidance (
HeaderSetError,AttributeError,RuntimeError, pipelineValueError) - Supported frameworks list expanded (now includes Dash and Shiny)
- Attribution to MDN and the OWASP Secure Headers Project
- Middleware usage +
- Presets behavior
- BASIC adds
Origin-Agent-Cluster,X-Download-Options,X-XSS-Protection: 0for Helmet-parity
- BASIC adds
- Response integration
- More robust sync/async detection
- Supports
response.headers.set(...)(Werkzeug-style) - Failures while applying headers are wrapped in
HeaderSetError
- Packaging/tooling
pyproject.tomlmodernized (metadata cleanup, setuptools floor bump, Ruff configuration)
Testing
- Expanded unit and contract tests, including improved coverage for sync/async response integration paths.
Upgrade notes
- If you were relying on the previous
with_default_headers()behavior, review the new presets and choose:Preset.BALANCED(default, recommended)Preset.BASIC(Helmet-parity compatibility)Preset.STRICT(hardened; no preload by default)
- If your app needs multi-valued headers, prefer
header_items()and/or configure middlewaremulti_ok.
See the migration guide: docs/migration.md.
What's Changed
- feat: CI for unit tests + explicit Python 3.13 & 3.14 support by @BoboTiG in #39
- secure v2.0.0rc1: presets redesign, ASGI/WSGI middleware, and header updates by @cak in #40
New Contributors
Full Changelog: v1.0.1...v2.0.0rc1