2014-02-04 2 views
0

Примечание: Я думаю, рамки для бутылок здесь не актуальны. Wsgi есть.apache2, mod_wsgi, веб-приложение python (рамка для бутылок)

Мне удалось настроить apache для работы с wsgi и однофайльным веб-приложением на основе флэш-оболочки python. Ниже файлы - это то, что у меня есть прямо сейчас - apache использует virtualenv и запускает единственный файл wsgi/py, содержащий все.

виртуального хоста:

<VirtualHost *:80> 
    ServerName bottle-test 

    WSGIDaemonProcess bottle-test user=www-data group=www-data processes=1 threads=5 
    WSGIScriptAlias//home/tducin/Development/Python/bottle-test/src/app.wsgi 

    <Directory /home/tducin/Development/Python/bottle-test/src> 
     WSGIProcessGroup bottle-test 
     WSGIApplicationGroup %{GLOBAL} 
     Order deny,allow 
     Allow from all 
    </Directory> 
    ErrorLog /var/log/apache2/wsgi/error-bottle.log 
    CustomLog /var/log/apache2/wsgi/access-bottle.log combined 
</VirtualHost> 

httpd.conf (это где мой virtualenv проживает):

WSGIPythonHome /home/tducin/Development/Python/bottle-test 

И, наконец, это app.wsgi:

import os 

# Change working directory so relative paths (and template lookup) work again 
os.chdir(os.path.dirname(__file__)) 

import bottle 

app = bottle.Bottle() 

@app.route('/') 
def siema(): 
    return bottle.template('<h1>SIEMA {{arg}}!</h1>', arg='Janie') 

@app.route('/hello/<name>') 
def hello(name): 
    return bottle.template('<b>Hello {{name}}</b>!', name=name) 

application = app 

Что Я хочу сделать это, чтобы отделить слой wsgi от остальной части приложения. Я несколько раз пытался импортировать приложение из другого файла, но каждый раз получал ошибку Failed to import module. Кто-нибудь знает, как отделить wsgi от приложения?


редактировать: Я переехал httpd.conf в wsgi.conf (она загружена), и теперь у меня есть следующие:

WSGIPythonHome /home/tducin/Development/Python/bottle-test 
WSGIPythonPath /home/tducin/Development/Python/bottle-test/src 

Проблема в том, что теперь я получил ошибку 500 , журналы ошибок apache:

[Wed Feb 05 09:24:32 2014] [error] [client 127.0.0.1] mod_wsgi (pid=4260): Target WSGI script '/home/tducin/Development/Python/bottle-test/src/app.wsgi' cannot be loaded as Python module. 
[Wed Feb 05 09:24:32 2014] [error] [client 127.0.0.1] mod_wsgi (pid=4260): Exception occurred processing WSGI script '/home/tducin/Development/Python/bottle-test/src/app.wsgi'. 
[Wed Feb 05 09:24:32 2014] [error] [client 127.0.0.1] Traceback (most recent call last): 
[Wed Feb 05 09:24:32 2014] [error] [client 127.0.0.1] File "/home/tducin/Development/Python/bottle-test/src/app.wsgi", line 7, in <module> 
[Wed Feb 05 09:24:32 2014] [error] [client 127.0.0.1]  import server 
[Wed Feb 05 09:24:32 2014] [error] [client 127.0.0.1] ImportError: No module named server 

src/server.py содержит информацию о приложении для бутылок. Файл app.wsgi получил полные исполняемые разрешения:

-rwxrwxr-x 1 tducin tducin 377 Feb 5 09:22 app.wsgi 

ответ

1

Использование Apache/mod_wsgi, он не выглядит в текущем рабочем каталоге процесса для модулей при импорте. Это в силу того, как вещи, когда работа Python используется во встроенных системах. Таким образом, вам нужно сообщить mod_wsgi, что дополнительные каталоги должны быть добавлены в путь поиска модуля Python. Предполагая, что каталог, в котором дополнительные модули является такой же, как ваш WSGI сценарий, используйте:

WSGIPythonPath /home/tducin/Development/Python/bottle-test/src 

Кстати, это плохая практика, в WSGI приложений полагаться на текущий рабочий каталог является конкретное значение и использовать относительные пути в файле конфигурации/шаблона. IOW, это не очень хорошая идея использовать:

os.chdir(os.path.dirname(__file__)) 

Вы всегда должны вычислить пути системных файлов динамически на основе настроенного значения корневого каталога или os.path.dirname (__ FILE__). То есть, как и вы, но просто используйте его в качестве входа в os.chdir(), используйте его для создания правильных имен абсолютных путей для файлов.

+0

Я последовал за вашим ответом, но все же что-то не так. Я обновил свой вопрос. PS часть 'os.chdir' поступает из официальных документов для бутылок: http://bottlepy.org/docs/dev/tutorial_app.html#server-setup. – ducin

+0

Являются ли каталоги/файлы доступными для пользователя, которые Apache работает как? –

0

Я попробовал предложение Грэма, но это не сработало для меня.

Это то, что сработало для меня:
[BTW, Я работаю над OSX. Пожалуйста, настройте пути, пользователь, группу в соответствии с вашей операционной системой]

/Library/WebServer/Documents/hello_app/app.WSGI:

import sys 

sys.path.insert(0, "/Library/WebServer/Documents/hello_app") 

import bottle 
import hello 
application = bottle.default_app() 

/Library/WebServer/Documents/hello_app/hello.py:

from bottle import route 

@route('/hello') 
def hello(): 
    return "Hello World!" 

/etc/apache2/extra/httpd-vhosts.conf:

<VirtualHost *:80> 
    ServerName xyz.com 

    WSGIDaemonProcess hello_app user=_www group=_www processes=1 threads=5 
    WSGIScriptAlias /v1 /Library/WebServer/Documents/hello_app/app.wsgi 

    <Directory /Library/WebServer/Documents/hello_app> 
     WSGIProcessGroup hello_app 
     WSGIApplicationGroup %{GLOBAL} 
     Order deny,allow 
     Allow from all 
    </Directory> 
</VirtualHost> 

Не забудьте перезапустить сервер Apache.

Check the app in the web browser

6

Следующий подход работает для меня.
шаг 1: Настройка виртуального хоста:
Linux Путь:/и т.д./apache2/сайты-доступные/по умолчанию

<VirtualHost *:80> 
    ServerAdmin [email protected] 

    WSGIDaemonProcess my_working_dir user=www-data group=www-data 
    WSGIScriptAlias /my_working_dir /var/www/my_working_dir/app.wsgi 

    <Directory /var/www/my_working_dir> 
       WSGIProcessGroup my_working_dir 
       WSGIApplicationGroup %{GLOBAL} 
       Order deny,allow 
       Allow from all 
    </Directory> 
    ErrorLog ${APACHE_LOG_DIR}/error.log 
    CustomLog ${APACHE_LOG_DIR}/access.log combined 
</VirtualHost> 

Шаг 2: Настройка app.wsgi файла.
путь: /var/www/my_working_dir/app.wsgi

import sys, os 

# Change working directory so relative paths (and template lookup) work again 
os.chdir(os.path.dirname(__file__)) 
sys.path.append(os.path.dirname(__file__)) 

# ... build or import your bottle application here ... 
# Do NOT use bottle.run() with mod_wsgi 

import bottle 
from rs import app as application 
from bottle import route 
import hello_world 
application=bottle.default_app() 

Примечание: Импорт файла без использования .py расширения. (Импорт hello_world)

Шаг 3: Создание hello_world.py
Путь: /var/www/my_working_dir/hello_world.py

from bottle import route, run 

@route('/hello') 
def hello(): 
    return "Hello World!" 

#Comment out the localhost part, to test Apache configuration. 
#run(host='localhost', port=8080, debug=True) 

шаг 4: Перезапустите сервер Apache & тест ваш апи с Скручивание:
$ curl -i GET "http://[hostname]/hello"

Выход:

HTTP/1.1 200 OK 
Date: Thu, 06 Aug 2015 21:51:54 GMT 
Server: Apache/2.2.22 (Ubuntu) 
Content-Length: 12 
Content-Type: text/html; charset=UTF-8 
Смежные вопросы