私は Crossbar.io 0.10.4 と Django 1.6.11 を試して、こちらの例に従おうとしています。このコードは、「/」で Django アプリを提供するように Crossbar.io を構成できることを示していますが、私の構成でそれを試みると、Python インポート エラーが発生します。
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 プロジェクト ディレクトリが含まれていません。通常、特定のプロジェクト ディレクトリを wsgi ファイルの sys.path に追加しますが、どうやらそのワークフローは Crossbar.io では機能しません。相対インポートを試みると失敗します (「パッケージ」引数を指定する必要があります)。フル パスも失敗します (上記と同じファイル名エラーによるインポート)。
"/" の定義を削除しても、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()
----更新1------
ダニエルの提案に従って、ファイルを wsgi.py だけに変更し、構成をファイル名/ディレクトリ パスではなく Python モジュール パスを使用するように変更しました。構成は次のようになります。
"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
-------更新2-------
私が見つけた唯一の解決策 (「ハック」と読む) は、プロジェクト パスをハードコードcrossbar/worker/router.py
して、Python 検索パス リストに含めることです。
sys.path.insert(0, '/var/www/myapp/myapp_main/')
sys.path.insert(1, '/var/www/myapp/')
もっと良い方法があるはずです...