mod_python с apache2, ошибка (повторного) импорта модуля

Я пытаюсь заставить mod-python работать с apache2, но безуспешно. Я выполнил несколько руководств по работе с mod-python, но не вижу, что делаю неправильно.

Когда я посещаю http://site.example.com/cgi-bin/test.py Я действительно получаю свою страницу 404! (в то время как я получаю 403 запрет, если файл действительно не существует)

Вот моя установка:

В /etc/apache2/sites-enabled/ есть файлы конфигурации, названные в честь каждого из моих доменов. В файл site.example.com я добавил это в раздел пользовательских директив:

# Begin user directives <--
<Directory /home/default/site.example.com/user/htdocs/cgi-bin/>
     Options Indexes FollowSymLinks MultiViews
     AllowOverride AuthConfig
     Order allow,deny
     allow from all
     AddHandler mod_python .py
     PythonHandler mod_python.publisher
     PythonDebug On
</Directory>
# --> End user directives

полный файл здесь, который включает строку:

ИЗМЕНИТЬ, чтобы добавить содержимое test.py:

#!/usr/bin/python  
print "Content-type: text/html"  
print  
print 'hello world'  
#print 1/0

Как показано выше, я получаю 404 /python/test.py was not found on this server.

Но если я раскомментирую последнюю строку, я получу:

Mod_python error: "PythonHandler mod_python.publisher"

Traceback (most recent call last):

  File "/usr/lib/python2.4/site-packages/mod_python/apache.py", line 299, in HandlerDispatch
    result = object(req)

  File "/usr/lib/python2.4/site-packages/mod_python/publisher.py", line 98, in handler
    path=[path])

  File "/usr/lib/python2.4/site-packages/mod_python/apache.py", line 457, in import_module
    module = imp.load_module(mname, f, p, d)

  File "/home/default/site.example.co.uk/user/htdocs/python/test.py", line 5, in ?
    print 1/0

ZeroDivisionError: integer division or modulo by zero

Эта трассировка выглядит правильно? Кстати, включение cgitb ни на что не влияет.

Есть ли какая-либо другая информация, которую я могу добавить, чтобы помочь диагностировать это?


person Tom Viner    schedule 01.04.2009    source источник


Ответы (3)


Насколько я знаю, обработчик Publisher должен принимать объект запроса и метод, чтобы вернуть ответ.

В моих сценариях у меня есть что-то вроде этого:

#!/usr/bin/python  
def run(req):
  return 'Hello world!'

Затем перейдите на страницу http://.../python/test.py/run

В этом случае req — это объект запроса, который передается обработчиком издателя.

И, если у вас его еще нет, вам нужно иметь файл __init__.py в том же каталоге, где находится test.py.

Кроме того, с издателем я заметил, что иногда ответ кэшируется. Я получу те же ошибки в браузере, которые я уже исправил. Итак, неплохо перезапустить apache, если вы видите ошибку, которую, по вашему мнению, вы уже исправили.

person landyman    schedule 02.04.2009
comment
Хорошо, теперь это работает! Спасибо. С серверным python, который я использовал в прошлом, вы просто печатаете свой вывод пользователю. Какие существуют варианты для PythonHandler? Какой из них я использовал, когда печатал прямо на вывод (включая заголовки)? Не думайте, что это была PSP. Python как CGI-скрипт? - person Tom Viner; 03.04.2009
comment
Что ж, это мог быть либо Python как CGI-скрипт, либо CGI-обработчик в mod_python. Они почти одинаковы. Если вы хотите использовать mod_python таким образом, вместо этого используйте это в вашем файле конфигурации Apache: PythonHandler mod_python.cgihandler Тогда ваши обычные сценарии Python CGI должны работать. - person landyman; 03.04.2009
comment
+1 . У меня был PythonHandler mod_python.publisher. Пришлось изменить его на PythonHandler mod_python.cgihandler, чтобы скрипты Python работали как cgi. - person ; 12.08.2010

Для начала я бы посоветовал не использовать каталог cgi-bin, поскольку он предназначен для сценариев CGI. Файлы Python, которые загружаются с помощью mod_python, не являются сценариями CGI. (Теоретически вы должны иметь возможность загружать файлы Python из каталога cgi-bin, но отладка будет проще, если вы создадите для файлов Python отдельный каталог.)

Теперь корневой каталог вашего документа — /home/default/site.example.com/user/htdocs, поэтому я предлагаю создать подкаталог, скажем, /home/default/site.example.com/user/htdocs/python, чтобы поместить в него файлы Python — просто для тестирования. Не создавайте никаких директив Alias или ScriptAlias для этого каталога (потому что он уже находится в корневом каталоге документа), но вам нужно поместить что-то вроде этого в файл виртуального хоста:

<Directory /home/default/site.example.com/user/htdocs/python/>
     Order allow,deny
     Allow from all
     AddHandler mod_python .py
     PythonHandler mod_python.publisher
     PythonDebug On
</Directory>

.Переместите файл test.py в этот каталог и попробуйте перейти к http://site.example.com/python/test.py, и вы должны увидеть результаты функции index в файле test.py.

person David Z    schedule 01.04.2009
comment
Спасибо, только что попробовал, я получаю этот странный режим ошибки: если в сценарии есть ошибка, она отображается; скрипт не имеет ошибки... вызывает 404! - person Tom Viner; 01.04.2009
comment
Как насчет публикации содержимого test.py? (отредактируйте это в своем вопросе) - person David Z; 01.04.2009

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

def index():
  return "hello world"

"http://somesite.com/path/test.py" открывает функцию "индекс " по умолчанию.

Открывается "http://somesite.com/path/test.py/run. вместо этого функция «запустить».

Вы можете стать более изобретательным, но приведенное выше даст вам базовую страницу mod_python.

person Thomas Weigel    schedule 20.04.2009