mod_python с apache2, (Re) ошибка импорта модуля - PullRequest
2 голосов
/ 01 апреля 2009

Я пытаюсь заставить 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 не имеет никакого эффекта.

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

Ответы [ 3 ]

2 голосов
/ 02 апреля 2009

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

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

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

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

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

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

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

2 голосов
/ 21 апреля 2009

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

def index():
  return "hello world"

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

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

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

2 голосов
/ 01 апреля 2009

Для начала я бы предложил не использовать каталог 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.

...