2015-08-10 3 views
1

Я экспериментирую с Crossbar.io 0.10.4 и Django 1.6.11, пытаясь следовать example here. Код показывает, вы можете настроить Crossbar.io обслуживать до приложения Django на «/» - но когда я пытаюсь что в моей конфигурации, я получаю сообщение об ошибке импорта Python:Crossbar.io настроить WSGI для приложения Django

ApplicationError: ApplicationError('crossbar.error.invalid_configuration', args = (u"WSGI app module 'apache/django.wsgi' import failed: Import by filename is not supported. - Python search path was .... 

Мой config.json здесь :

{ 
    "controller": { 
    }, 
    "workers": [ 
     { 
     "type": "router", 
     "realms": [ 
      { 
       "name": "backstage-producer", 
       "roles": [ 
        { 
        "name": "anonymous", 
        "permissions": [ 
         { 
          "uri": "*", 
          "publish": false, 
          "subscribe": true, 
          "call": false, 
          "register": false 
         } 
        ] 
        } 
       ] 
      } 
     ], 
     "transports": [ 
      { 
       "type": "web", 
       "endpoint": { 
        "type": "tcp", 
        "port": 8080 
       }, 
       "paths": { 
        "/": { 
        "type": "wsgi", 
        "module": "apache/django.wsgi", 
        "object": "application" 
        }, 
        "ws": { 
        "type": "websocket", 
        "debug": false 
        }, 
        "notify": { 
        "type": "publisher", 
        "realm": "backstage-producer", 
        "role": "anonymous" 
        }, 
        "static": { 
        "type": "static", 
        "directory": "../static" 
        } 
       } 
      } 
     ] 
     } 
    ] 
} 

Где пути Python искали сделать не включить мой каталог проекта Django. Обычно я добавляю свои конкретные каталоги проектов в sys.path в свой файл wsgi, но, видимо, этот рабочий процесс не работает с Crossbar.io. Попытка относительного импорта не выполняется (необходимо указать аргумент «package»), как и полный путь (тот же импорт по ошибке имени файла, как указано выше).

Извлечение определения для «/» не работает, потому что Crossbar.io жалуется, что он должен быть определен.

Как правильно настроить это с помощью Crossbar.io? Мой файл Apache/django.wsgi ниже, для справки:

ALLDIRS = ['/usr/local/pythonenv/myapp/lib/python2.6/site-packages'] 

import os 
import sys 
import site 

# from https://code.google.com/p/modwsgi/wiki/VirtualEnvironments 

sys.path.insert(0, '/var/www/myapp/myapp_main/') 
sys.path.insert(1, '/var/www/myapp/') 

prev_sys_path = list(sys.path) 
for directory in ALLDIRS: 
    site.addsitedir(directory) 

new_sys_path = [] 
for item in list(sys.path): 
    if item not in prev_sys_path: 
     new_sys_path.append(item) 
     sys.path.remove(item) 

sys.path[:0] = new_sys_path 

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp_main.settings' 

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

---- UPDATE 1 ------

За предложение Даниила, я изменил файл только wsgi.py и my config, чтобы использовать путь к модулю Python, а не путь к файлу/директории. Config тогда выглядел следующим образом:

"paths": { 
     "/": { 
     "type": "wsgi", 
     "module": "apache.wsgi", 
     "object": "application" 
     }, 

Приводит же исключение:

ApplicationError: ApplicationError('crossbar.error.invalid_configuration', args = (u"WSGI app module 'apache.wsgi' import failed: No module named apache.wsgi - Python search path was 

Моя структура каталогов:

Project 
    |- apache 
    |  |-__init__.py 
    |  |-wsgi.py 
    |-.crossbar 
      |-config.json 

------- UPDATE 2 ---- ---

Единственное решение (прочитанное «hack»), которое я нашел, - это жесткий код моего пути проекта в crossbar/worker/router.py так что он включен в список поиска пути Python:

sys.path.insert(0, '/var/www/myapp/myapp_main/') 
sys.path.insert(1, '/var/www/myapp/') 

Похоже, что там должно быть лучше ...

ответ

3

ошибка говорит вам, что у вас есть путь к файлу в настройках этой точки в ваш файл WSGI, тогда как вам нужен путь к модулю Python. Ваш файл WSGI должен быть файлом под названием «wsgi.py» внутри вашего каталога проекта (который предположительно является «apache», что является странным именем для проекта, который явно не использует Apache).

   "/": { 
       "type": "wsgi", 
       "module": "apache.wsgi", 
       "object": "application" 
       }, 

Update Так что я нашел config docs в прошлом: они действительно не выходят из своего пути, чтобы сделать его легко, как на самом деле обеспечения индекса. Ну что ж.

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

"workers": [ 
     { 
     "type": "router", 
     "options": { 
      "pythonpath": ["/var/myapp/myapp_main/", "/var/myapp"] 
     }, 
     ... 
     "transports": { 
      ... 
+0

Спасибо за ответ - изменение расширения не работает (обновленная информация выше по конфигурации и ошибок).Ха-ха, и да, это странное имя, играя с устаревшим приложением ... – user

+0

А, спасибо! Я не видел этого в доке ... замечательная находка. Сейчас работает как шарм. – user