Django + Apache wsgi = проблема путей - PullRequest
0 голосов
/ 13 мая 2010

У меня есть это представление, которое генерирует меню опций языка интерфейса

def lang_menu(request,language):

    lang_choices = []
    import os.path

    for lang in settings.LANGUAGES:
        if os.path.isfile("gui/%s.py" % lang) or os.path.isfile("gui/%s.pyc" % lang):
            langimport = "from gui.%s import menu" % lang
            try:
                exec(langimport)
            except ImportError:
                lang_choices.append({'error':'invalid language file'})
            else:
                lang_choices.append(menu)
        else:
            lang_choices.append({'error':'lang file not found'})

    t = loader.get_template('gui/blocks/lang_menu_options.html')

    data = ''

    for lang in lang_choices:
        if not 'error' in lang:
            data = "%s\n%s" % (data,t.render(Context(lang)))

    if not data:
        data = "Error! No languages configured or incorrect language files!"

    return Context({'content':data})

Когда я использую сервер разработки (python manage.py runserver ...), он работает нормально. Но когда я перенес свое приложение на сервер apache wsgi, у меня появляется ошибка "No languages configured or incorrect language files!"

Вот мой конфиг Apache

<VirtualHost *:9999>

WSGIScriptAlias / "/usr/local/etc/django/terminal/django.wsgi"

<Directory "/usr/local/etc/django/terminal">
    Options +ExecCGI
    Allow From All
</Directory>

Alias /media/ "/usr/local/lib/python2.5/site-packages/django/contrib/admin/media/"
<Location /media/>
    SetHandler None
</Location>

<Directory "/usr/local/lib/python2.5/site-packages/django/contrib/admin/media/>
    Allow from all
</Directory>

Alias /static/ "/usr/local/etc/django/terminal/media/"
<Location /static/>
    SetHandler None
</Location>

ServerName *******
ServerAlias *******
ErrorLog /var/log/django.error.log
TransferLog /var/log/django.access.log

</VirtualHost>

django.wsgi:

import os, sys
sys.path.append('/usr/local/etc/django')
sys.path.append('/usr/local/etc/django/terminal')
os.environ['DJANGO_SETTINGS_MODULE'] = 'terminal.settings'

import django.core.handlers.wsgi

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

Это похоже на проблему с настройкой пути, но я застрял здесь ...

Ответы [ 3 ]

2 голосов
/ 13 мая 2010

Дает ли это правильный путь, если вы называете его в lang_menu?

os.path.abspath(os.path.dirname(__file__))

Если это действительно указывает на каталог, в котором находится ваш модуль представления, вы можете создать оттуда, чтобы создать абсолютный путь, например ::

here = lambda *x: os.path.join(os.path.abspath(os.path.dirname(__file__)), *x)
if os.path.isfile(here('gui', '%s.py' % lang)):
    ...
1 голос
/ 13 мая 2010

Возможно, проблема в строке os.path.isfile("gui/%s.py" % lang). Вы используете относительный путь здесь. Вместо этого используйте абсолютный путь, и все будет в порядке.

Несколько других советов:

  1. Не используйте exec для импорта файлов. Используйте __import__ вместо
  2. Не ищите файлы для выбора конфигурации! это медленно и ненадежно. Сохраните данные в базе данных, например.
1 голос
/ 13 мая 2010

Трудно увидеть, что происходит, потому что, хотя вы храните полезные ошибки в цикле, вы затем перезаписываете их все с общей ошибкой в ​​конце. Было бы более полезно составить список обнаруженных ошибок.

Я бы также спросил, почему вы управляете языковыми файлами вручную, а не используете встроенную обработку интернационализации / локализации.

...