Как доставить статический HTML с plone.app.theming

Я использую Diazo для развертывания статического html-файла 'ticker.html' по определенной ссылке. Эта страница вообще ничего не использует из контента.

Это rules.xml:

<rules xmlns="http://namespaces.plone.org/diazo"
       xmlns:css="http://namespaces.plone.org/diazo/css"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <rules if-path="/Plone/ticker/ /ticker/">
    <theme href="ticker.html" />
  </rules>

  <rules css:if-content="#visual-portal-wrapper" if-not-path="/Plone/ticker/ /ticker/">
    <theme href="index.html" />    
    The rest of the theme...
  </rules>
</rules>

Он работает нормально и HTML-код правильный, но код возврата http://localhost:8080/Plone/ticker 404. Только если я создаю фиктивный контент в Plone в этом месте, я получаю 200. Возвращаемое значение также немного изменяется: когда есть фиктивный контент, Diazo добавляет базовый тег в заголовок:

<base href="http://localhost:8080/Plone/ticker/" />

Как я могу сказать Diazo полностью игнорировать контент и возвращать 200, даже если нет фиктивного контента?

Если вам интересно: я использую Diazo для этого, потому что plone.app.themeing позволяет изменять статическую страницу через Интернет.

2 ответа

Решение

Преобразование plone.app.theming является последним шагом в конвейере доставки. Контент уже был вызван из Plone, чтобы его можно было объединить с темой. Так что это не подходящее место для этого.

Вместо этого сделайте это с правилами перезаписи вашего обратного прокси. Сделайте так, чтобы прокси получал ваш тикер всякий раз, когда он получает запрос на целевой URL. Вы также сэкономите много циклов ЦП в этом процессе, так как вы избежите всей поездки через оборудование Zope/Plone.

У меня был похожий вариант использования, где я хочу сервировать некоторые js-партиалы через Zope для AngularJS. Они есть text/html поэтому они преобразились через plone.app.theming, После глубокого изучения plone.app.theming я перегружен ThemeTranform переходник с подклассами в новом файле transforms.py как показано ниже:

# -*- coding: utf-8 -*-
from plone.app.theming import transform
from your.theme.interfaces import IYourThemeLayer
from zope.component import adapter
from zope.interface import Interface


@adapter(Interface, IYourThemeLayer
class ThemeTransform(transform.ThemeTransform):

    def parseTree(self, result):

        # Prevent diazo from adding doctype and html head to every
        # html file. Exclude all partial resources from theme transforms
        if '/++resource++your.theme.js-partials/' in self.request.getURL():
            return None

        return super(ThemeTransform, self).parseTree(result)

... и зарегистрируйтесь в zcml с тем же именем, что и по умолчанию ThemeTransform использование адаптера:

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:zcml="http://namespaces.zope.org/zcml"
    i18n_domain="your.theme">

    <!-- Override plone.app.theming adapter -->
    <adapter
        name="plone.app.theming.transform"
        factory=".transform.ThemeTransform"
        zcml:condition="installed plone.app.theming"
        />

</configure>

Может быть связано с этой проблемой: https://dev.plone.org/ticket/13139

Другие вопросы по тегам