Вы можете выполнить шаблоны web2py с помощью функции gluon.template.render
, но если шаблон был разработан, чтобы быть выполнены в приложении web2py, он может включать в себя ссылку на некоторые объекты web2py среды (например, HTML вспомогательных объекты, объект T
перевода, request
и response
объектов и т. Д.), Которые были бы недоступны при вызове функции render
вне HTTP-запроса web2py.
Если надлежащее исполнение шаблона требует web2py среды, вы можете создать его, используя функцию gluon.shell.env
:
import os
import gluon.shell
context_dict = {...} # The context to be passed to the template.
app = 'myapp'
app_path = os.path.join(os.path.dirname(os.path.abspath(gluon.shell.__file__)),
'..', '..', 'applications', app)
w2p_env = gluon.shell.env(app, dir=app_path, import_models=True)
context_dict.update(**w2p_env) # Update context with web2py environment objects.
response = w2p_env['response']
html = response.render(os.path.join(app_path, 'views', 'mycontroller', 'myview.html'),
context=context_dict)
gluon.shell.env
возвращает словарь, содержащий все объекты web2py среды выполнения. Если import_models=True
, как и в приведенном выше коде, он также будет выполнять модели приложения (и, следовательно, любые объекты, определенные в моделях, также будут включены в возвращаемый словарь).
Обновляя context_dict
с полной средой выполнения web2py, мы гарантируем, что любые объекты web2py, на которые ссылаются в шаблоне (и любые шаблоны, которые он расширяет или включает), будут доступны.
Окружающая среда w2p_env
также включает в себя объект response
, поэтому мы можем использовать метод response.render
для визуализации шаблона. В качестве альтернативы, как отмечалось выше, мы могли бы использовать функцию gluon.template.render
.
Альтернативный подход заключается просто запустить сценарий Python в среде приложения web2py:
python web2py.py -S myapp -M -R '/path/to/myscript.py'
При таком подходе myscript.py может сделать ссылки на любые web2py объектов окружающей среды, которые будут доступны из код приложения (нет необходимости импортировать что-либо или явно создавать среду web2py).
Также обратите внимание, что вы можете исключить -M
, если вам не нужны модели приложения, которые будут запущены.
Add response = current.response. Я не знаю, правильно это или нет, но он работает на меня. –
'response' - это объект, доступный в среде. Web2py создает, когда он отвечает на HTTP-запрос - он не экспортируется из глюона. Вместо этого вы можете запустить функцию 'gluon.template.render', передав ей путь к визуализируемому шаблону, путь к папке представлений приложения (в случае, если ваш шаблон расширяет или включает любые другие представления) и словарь контекста. Однако это все равно не будет работать, если ваш шаблон (или любой его расширение/включает) включает ссылки на любые другие глобальные глобальные переменные (например, HTML-помощники и т. Д.). – Anthony
В качестве альтернативы вы можете запустить внешний модуль в контексте своего приложения web2py (которое предоставит ему доступ ко всем объектам среды Web2py), или вы можете создать среду web2py и включить ее в контекст, переданный в 'render'. Это зависит от того, что вы пытаетесь сделать, так трудно сказать, не зная больше. – Anthony