将自定义 HTTP headers 添加到 Wagtail 页面

Adding custom HTTP headers to Wagtail pages

我想创建一个新的 Wagtail 网站 production-ready 并使用了一些 Django security middleware 设置,例如 SECURE_BROWSER_XSS_FILTERSECURE_HSTS_SECONDS

安全中间件中似乎没有提供的一个 HTTP header 是 Expect-CT。我希望这个 header 到(最好有条件地在 production.py 设置文件中的 (a) 设置)有一个像这样的值:

max-age=31536000, enforce, report-uri="https://username.report-uri.com/r/d/ct/enforce"

在 Wagtail 中实现这个和其他自定义 HTTP headers 的好方法是什么?

我查看了现有的安全中间件并尝试在我的 Wagtail 项目中的文件中创建我自己的中间件,但我不确定如何在我的项目中引用 file/module base.py 文件。 (我目前是 Wagtail/Django/Python 初学者。)谢谢。

编辑:我认为尝试向安全中间件发出拉取请求可能是值得的,但是在 per-project/ad-hoc 的基础上向站点添加自定义 header 是我想要的能够做到。

我的问题是我不知道模块路径与文件名直接相关。

以下中间件根据设置创建并添加 header。

中间件模块的位置

my_project
├── my_app
│   ├── settings
│   │   ├── base.py
│   │   ├── production.py
│   ├── middleware.py

my_app/settings/base.py

MIDDLEWARE = [
    # ...
    'my_app.middleware.CustomHttpHeadersMiddleware',
]

my_app/middleware.py

import logging
from django.conf import settings

class CustomHttpHeadersMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

        try:
            self.expect_ct = settings.CUSTOM_SECURE_EXPECT_CT
        except AttributeError:
            self.expect_ct = False

    def __call__(self, request):
        response = self.get_response(request)

        if self.expect_ct:
            response['Expect-CT'] = self.__expect_ct_header_value()

        return response

    def __expect_ct_header_value(self):
        logger = logging.getLogger(__name__)

        try:
            max_age = settings.CUSTOM_SECURE_EXPECT_CT_MAX_AGE
        except AttributeError:
            max_age = 60 * 60 * 24  # 1 day
            logger.warning('CUSTOM_SECURE_EXPECT_CT setting is True but CUSTOM_SECURE_EXPECT_CT_MAX_AGE setting is not set. Default of %s applied.' % max_age)

        try:
            enforce = settings.CUSTOM_SECURE_EXPECT_CT_ENFORCE
        except AttributeError:
            enforce = False
            logger.warning('CUSTOM_SECURE_EXPECT_CT setting is True but CUSTOM_SECURE_EXPECT_CT_ENFORCE setting is not set. Default of False applied.')

        try:
            report_uri = settings.CUSTOM_SECURE_EXPECT_CT_REPORT_URI
        except AttributeError:
            report_uri = False
            logger.warning('CUSTOM_SECURE_EXPECT_CT setting is True but CUSTOM_SECURE_EXPECT_CT_REPORT_URI setting is not set. Default of False applied.')

        value = 'max-age=%s' % max_age

        if enforce:
            value += ', enforce'

        if report_uri:
            value += ', report-uri="%s"' % report_uri

        return value

my_app/settings/production.py

# Custom middleware.
CUSTOM_SECURE_EXPECT_CT = True
CUSTOM_SECURE_EXPECT_CT_MAX_AGE = 60 * 60 * 24 * 365  # 1 year
CUSTOM_SECURE_EXPECT_CT_ENFORCE = True
CUSTOM_SECURE_EXPECT_CT_REPORT_URI = 'https://username.report-uri.com/r/d/ct/enforce'