Добавление пользовательских заголовков HTTP на страницы Wagtail - PullRequest
0 голосов
/ 31 октября 2018

Я хочу сделать новый сайт Wagtail готовым к работе и использовать некоторые промежуточные программы безопасности Django , такие как SECURE_BROWSER_XSS_FILTER и SECURE_HSTS_SECONDS.

Один HTTP-заголовок, который, по-видимому, не предусмотрен в промежуточном программном обеспечении безопасности: Expect-CT . Я хотел бы, чтобы этот заголовок (предпочтительно при условии (а) настройки (ий) в файле настроек production.py) имел значение как:

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

Что может быть хорошим способом для реализации этого и других пользовательских заголовков HTTP в Wagtail?

Я посмотрел на существующее промежуточное ПО безопасности и попытался создать свое собственное промежуточное ПО в файле в моем проекте Wagtail, но не уверен, как ссылаться на файл / модуль в моем проекте в файле base.py. (Сейчас я новичок в трясогузке / джанго / питоне.) Спасибо.

Редактировать: Я ожидаю, что, возможно, стоило бы попытаться сделать запрос на извлечение промежуточного программного обеспечения безопасности, но я бы хотел, чтобы добавление пользовательских заголовков на сайт для каждого отдельного проекта / ad-hoc .

1 Ответ

0 голосов
/ 03 ноября 2018

Моя проблема заключалась в том, что я не знал, что путь к модулю напрямую связан с именем файла.

Следующее промежуточное ПО создает и добавляет заголовок на основе настроек.

Расположение модуля промежуточного программного обеспечения

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'
...