将自定义 HTTP headers 添加到 Wagtail 页面
Adding custom HTTP headers to Wagtail pages
我想创建一个新的 Wagtail 网站 production-ready 并使用了一些 Django security middleware 设置,例如 SECURE_BROWSER_XSS_FILTER
和 SECURE_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'
我想创建一个新的 Wagtail 网站 production-ready 并使用了一些 Django security middleware 设置,例如 SECURE_BROWSER_XSS_FILTER
和 SECURE_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'