1

私は 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/')

もっと良い方法があるはずです...

4

1 に答える 1

3

このエラーは、設定に WSGI ファイルを指すファイル パスがあることを示していますが、Python モジュール パスが必要です。WSGI ファイルは、実際にはプロジェクト ディレクトリ内の "wsgi.py" というファイルである必要があります (これはおそらく "apache" であり、明示的に Apache を使用していないプロジェクトの奇妙な名前です)。

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

更新だから、ついに構成ドキュメントを見つけました。実際にインデックスを提供するなど、簡単にするために邪魔になりません。しかたがない。

options設定を含むルーター構成にハッシュを提供できるようですpythonpath

"workers": [
      {
         "type": "router",
         "options": {
             "pythonpath": ["/var/myapp/myapp_main/", "/var/myapp"]
         },
         ...
         "transports": {
             ...
于 2015-08-10T20:24:57.607 に答える