2016-03-01 3 views
0

Я пытаюсь получить HTML, генерируемый web2py из другого модуля, так что я могу превратить его в PDF-файл:Как я могу вызвать URL-адрес web2py из внешнего модуля?

html = response.render('path/myview.html', context_dict) 

я включил это в верхней части моего файла:

sys.path.append('/home/www-data/web2py') 
from gluon import * 

Однако, я все еще получаю: NameError: global name 'response' is not defined

Может быть, есть более простой способ сделать это я не подумал?

+0

Add response = current.response. Я не знаю, правильно это или нет, но он работает на меня. –

+0

'response' - это объект, доступный в среде. Web2py создает, когда он отвечает на HTTP-запрос - он не экспортируется из глюона. Вместо этого вы можете запустить функцию 'gluon.template.render', передав ей путь к визуализируемому шаблону, путь к папке представлений приложения (в случае, если ваш шаблон расширяет или включает любые другие представления) и словарь контекста. Однако это все равно не будет работать, если ваш шаблон (или любой его расширение/включает) включает ссылки на любые другие глобальные глобальные переменные (например, HTML-помощники и т. Д.). – Anthony

+0

В качестве альтернативы вы можете запустить внешний модуль в контексте своего приложения web2py (которое предоставит ему доступ ко всем объектам среды Web2py), или вы можете создать среду web2py и включить ее в контекст, переданный в 'render'. Это зависит от того, что вы пытаетесь сделать, так трудно сказать, не зная больше. – Anthony

ответ

1

Вы можете выполнить шаблоны 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, если вам не нужны модели приложения, которые будут запущены.

0

Мне удалось заставить его работать, добавив мой скрипт python в папку «modules» для web2py.После этого я должен был изменить свои операторы импорта, которые ссылаются на другие файлы в «модулей» каталог:

from applications.myapp.modules.mymodule import mystuff from gluon import *

html = current.response.render('myview.html', context_dict)

Затем, чтобы запустить его из командной строки, я использовал:

python /home/www-data/web2py/web2py.py -S myapp -R 'path/to/myscript.py' Как описано Anthony

Я планирую вызывать этот модуль из задания cron после его завершения. Я предполагаю, что web2py cron будет использовать среду web2py, которая не потребует того же сценария выполнения, который я использовал для тестирования.

Смежные вопросы