1

我正在尝试使用 Crossbar.io 0.10.4 和 Django 1.6.11,尝试按照此处的示例进行操作。代码显示您可以配置 Crossbar.io 以在“/”处提供 Django 应用程序——但是当我在我的配置中尝试这样做时,我收到 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------

根据 Daniel 的建议,我将文件更改为 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--------

我发现的唯一解决方案(阅读“hack”)是将我的项目路径硬编码到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 回答