2012-03-30 1 views
2

Я разрабатываю Django с Apache, mod_wsgi, виртуальный окрДжанго, mod_wsgi и виртуальная окр

У меня есть виртуальный окр, что я хочу использовать здесь: [! Имя Missleading - длинная история] /главный/Энди/Dev/питон/асинхронный монго/

Я скачал mod_wsgi и скомпилирован с virtual_env как корень

./configure --with-питон =/дом/Энди/Dev/python/async-mongo/bin/python

Я побежал, как корень:

сделать установки

I Настройка WSGIPythonHome & Путь в http.conf

WSGIPythonHome /home/andy/dev/python/async-mongo/ 
WSGIPythonPath /home/andy/dev/python/async-mongo/lib/python2.6/site-packages 
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so 

Я думаю, что я следовал инструкции на http://code.google.com/p/modwsgi/wiki/VirtualEnvironments

Когда я запускаю приложение «Hello World» это работает

def application(environ, start_response): 
    status = '200 OK' 
    output = 'Hello World!' 
    response_headers = [('Content-type', 'text/plain'), 
         ('Content-Length', str(len(output)))] 
    start_response(status, response_headers) 

    return [output] 

Когда я пытаюсь импортировать модуль он терпит неудачу:

import sys; raise Exception(sys.path) 
def application(environ, start_response): 
    status = '200 OK' 
    output = 'Hello World!' 
    response_headers = [('Content-type', 'text/plain'), 
         ('Content-Length', str(len(output)))] 
    start_response(status, response_headers) 
    print >> sys.stderr, 'sys.prefix = %s' % repr(sys.prefix) 
    print >> sys.stderr, 'sys.path = %s' % repr(sys.path) 
    return [output] 

ошибка я вижу в журналах Апач :

[Пн мар 30, 15:09:53 2012] [уведомление] [уведомление] Apache/2.2.20 (Ubuntu) mod_wsgi/3.3 Конфигурация Python/2.6.7 - r esuming нормальные операции

........

Исключение: [ '/ дом/Энди/DEV/питон/асинхронной-Монго', «/ дом/Энди/DEV/python/async-mongo/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg ', ' /home/andy/dev/python/async-mongo/lib/python2.6/site -packages/pip-1.0.2-py2.6.egg ', ' /home/andy/dev/python/async-mongo/lib/python2.6/site-packages/txmongo-0.3-py2.6-linux -i686.egg ', ' /home/andy/dev/python/async-mongo/lib/python2.6 ', ' /home/andy/dev/python/async-mongo/lib/python2.6/plat -linux2 ', '/home/andy/dev/python/async-mongo/lib/python2.6/lib-tk', '/home/andy/dev/python/async-mongo/lib/python2.6/lib-old ', ' /home/andy/dev/python/async-mongo/lib/python2.6/lib-dynload ', ' /usr/lib/python2.6 ',' /usr/lib/python2.6/ Плат-linux2' , '/usr/lib/python2.6/lib-tk', '/home/andy/dev/python/async-mongo/lib/python2.6/site-packages']

Я угадываю, что где-то я все еще ссылаюсь на старый уровень python на уровне системы, но я не могу понять, где. Как я могу это исправить?

+4

Конечно, это терпит неудачу, потому что вы явно создавая исключение? –

+0

Что такое sys.path, который вы установили в wsgi.py? –

+0

@ DanielRoseman: его проблема не исключение, это sys.path, который он проверяет через сообщение об исключении. –

ответ

3

Вы поднимаете исключение здесь:

import sys; raise Exception(sys.path) 
+0

Ох. К сожалению. Я вижу, что Даниэль Роземан сказал об этом в комментариях. Извините за повторение. – alan

+0

Я думаю, что он создает исключение только для проверки sys.path во время выполнения. –

+0

oops - я поставил это, чтобы проверить время выполнения, потому что он не работал и полностью забыл об этом - извините, что я идиот. –

1

Место для скрипки с sys.путь находится по адресу your_application.wsgi. Я не думаю, что компиляция mod_wsgi, указывающая на виртуальный двоичный файл python, является хорошей идеей, вся точка virtualenv - это гибкость (например, несколько версий django, играющих хорошо на одной машине).

Моя взять на Джанго, апаш, WSGI и virtualenv это my_application.wsgi файл, как это:

import os 
import sys 
import site 

# Backup sys.path 
prev_sys_path = list(sys.path) 
# Add virtual environment to site directories: 
site.addsitedir('/var/lib/python-environments/my_env/lib/python2.6/site-packages') 

# settings.py sitting at /path/to/apps/my_application 
os.environ['DJANGO_SETTINGS_MODULE'] = 'my_application.settings' 
sys.path.append('/path/to/apps') 

# start the trick 
sys.path.extend([ 
    '/var/lib/python-environments/my_env/lib/python2.6/site-packages', 
    '/var/lib/python-environments/my_env/lib/python2.6/site-packages/django/contrib/admindocs', 
]) 
# Reorder syspath 
new_sys_path = [p for p in sys.path if p not in prev_sys_path] 
for item in new_sys_path: 
    sys.path.remove(item) 
# Make sure virtual env is first 
sys.path[:0] = new_sys_path 

import django.core.handlers.wsgi 
application = django.core.handlers.wsgi.WSGIHandler()