Как доставить статический 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