Я экспериментирую с 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/')
Похоже, что там должно быть лучше ...
Спасибо за ответ - изменение расширения не работает (обновленная информация выше по конфигурации и ошибок).Ха-ха, и да, это странное имя, играя с устаревшим приложением ... – user
А, спасибо! Я не видел этого в доке ... замечательная находка. Сейчас работает как шарм. – user