Как настроить apache и mode_wsgi для локальной разработки django на windows - PullRequest
1 голос
/ 30 июня 2011

Команда, с которой я сейчас работаю, переросла сервер разработки django для запуска приложений django в наших локальных средах разработки. Сама среда (server 2008 vm) представляет собой набор приложений .net, созданных на основе IIS7, в сочетании с несколькими приложениями django.

Нам необходимо, чтобы наши локальные среды разработки запускали все приложения одновременно для простоты разработки и тестирования. Мы решили перейти к полному экземпляру apache, работающему вместе с IIS, чтобы больше походить на наши производственные и тестовые среды (различие, конечно, в том, что Linux / Windows для хоста apache).

Мы настроили mod_wsgi и apache для локального запуска, однако кажется, что у нас не совсем правильно настроен путь python или django, так как во время выполнения наши приложения жалуются, что представления не существуют с ошибкой, например:

Не удалось импортировать report.views. Ошибка была: загрузка DLL не удалась: указанный модуль не найден.

Местоположение исключения django показывает:

Exception Location: C:\Python27\lib\site-packages\django\core\urlresolvers.py in _get_callback, line 132

Поэтому мы предполагаем, что это какая-то проблема пути, но пока мы не смогли выяснить, что происходит не так.

Спасибо всем.

LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonHome X:\PathToApplication\venv\Scripts

<VirtualHost *:8000>
    ServerName applicationdomain
    ServerAlias applicationapidomain

    SetEnv DJANGO_ENV local

    WSGIScriptAlias / X:/PathToApplication/apache/django.wsgi
    <Directory X:/PathToApplication/ >
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

<VirtualHost *:8001>
    ServerName applicationdomain

    SetEnv DJANGO_ENV local

    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\conf\wildcard.crt"
    SSLCertificateKeyFile "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\conf\wildcard.key"

    WSGIScriptAlias / X:/PathToApplication/apache/django.wsgi
    <Directory X:/PathToApplication/ >
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

1 Ответ

4 голосов
/ 30 июня 2011

Ваша проблема связана с скомпилированными модулями и mod_wsgi.

Python от Python.org имеет встроенный манифест, который позволяет ему загружать файлы DLL. При компиляции модулей C Python использовал для встраивания манифеста в скомпилированные модули, однако с тех пор начал удалять их по умолчанию. Проблема в том, что mod_wsgi включает свой собственный интерпретатор Python, в который не включен этот файл манифеста.

Я думаю, чтобы заставить это работать, вам нужно либо скомпилировать с MingW, встроить манифест в Apache, либо изменить python, чтобы встроить манифест в модули, которые вы компилируете.

http://www.mail-archive.com/modwsgi@googlegroups.com/msg06255.html получил ответ от того, кто встраивал манифест в apache2.

Если моя память хранится где-то около строки 680ish Python27 / Lib / distutils / msvc9compiler.py, должен быть фрагмент кода, похожий на

try:
    # Remove references to the Visual C runtime, so they will
    # fall through to the Visual C dependency of Python.exe.
    # This way, when installed for a restricted user (e.g.
    # runtimes are not in WinSxS folder, but in Python's own
    # folder), the runtimes do not need to be in every folder
    # with .pyd's.
    manifest_f = open(manifest_file)
    try:
        manifest_buf = manifest_f.read()
    finally:
        manifest_f.close()
    pattern = re.compile(
        r"""<assemblyIdentity.*?name=("|')Microsoft\.""" \
        r"""VC\d{2}\.CRT("|').*?(/>|</assemblyIdentity>)""",
        re.DOTALL)
    manifest_buf = re.sub(pattern, "", manifest_buf)
    pattern = "<dependentAssembly>\s*</dependentAssembly>"
    manifest_buf = re.sub(pattern, "", manifest_buf)
    manifest_f = open(manifest_file, 'w')
    try:
        manifest_f.write(manifest_buf)
    finally:
        manifest_f.close()
except IOError:
    pass

удаление или комментирование этого должно помешать python удалить файл манифеста.

...