Хорошо, я нашел решение, вместо добавления другого промежуточного программного обеспечения я просто перезаписываю SharedDataMiddleware и изменяю файл при его чтении.
РЕДАКТИРОВАТЬ: добавлены рекурсивные вызовы для включения файла во включенные файлы. EDIT2: добавлена поддержка #echo SSI
class SharedDataSSIMiddleware(SharedDataMiddleware):
""" Replace SSI includes with the real files on request
"""
ssi_incl_expr = re.compile(r'<!-- *# *include *(virtual|file)=[\'\"]([^\'"]+)[\'\"] *-->')
ssi_echo_expr = re.compile(r'<!-- *# *echo *encoding=[\'\"]([^\'"]+)[\'\"] *var=[\'\"]([^\'"]+)[\'\"] *-->')
def __init__(self, app, exports, disallow=None, cache=True, cache_timeout=60 * 60 * 12, fallback_mimetype='text/plain'):
super(SharedDataSSIMiddleware, self).__init__(app, exports, disallow, cache, cache_timeout, fallback_mimetype)
self.environment = None
def get_included_content(self, path_info, path):
full_path = os.path.join(path_info, path)
with open(full_path) as fp:
data = fp.read()
return self._ssi_include(full_path, data)
def _get_ssi_echo_value(self, encoding, var_name):
return self.environment.get(var_name)
def _ssi_include(self, filename, content):
content = re.sub(
self.ssi_incl_expr,
lambda x: self.get_included_content(os.path.dirname(filename), x.groups()[1]),
content
)
content = re.sub(
self.ssi_echo_expr,
lambda x: self._get_ssi_echo_value(*x.groups()),
content
)
return content
def _opener(self, filename):
file = cStringIO.StringIO()
with open(filename, 'rb') as fp:
content = fp.read()
content = self._ssi_include(filename, content)
file.write(content)
file.flush()
size = file.tell()
file.reset()
return lambda: (file, datetime.utcnow(), size)
def __call__(self, environ, start_response):
self.environment = environ
response = super(SharedDataSSIMiddleware, self).__call__(environ, start_response)
self.environment = None
return response
Это читает фактический файл, изменяет его и возвращает объект StringIO с измененными данными вместо фактического файла. Не используйте параметр static_files
в run_simple
файла werkzeug, это просто добавит стандартное программное обеспечение SharedDataMiddleware, которое нам здесь не нужно.
просто оберните свое приложение промежуточным программным обеспечением выше:
app = SharedDataSSIMiddleware(app, exports={'/foo': 'path'})
person
Goir
schedule
21.08.2015