Crossbar.io 为 Django 应用配置 WSGI
Crossbar.io configure WSGI for Django app
我正在试验 Crossbar.io 0.10.4 和 Django 1.6.11,试图遵循 example here。代码显示您可以配置 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。尝试相对导入失败(需要指定 "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()
----更新 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/')
看来应该有更好的方法...
错误告诉您设置中的文件路径指向您的 WSGI 文件,而您需要 Python 模块路径。您的 WSGI 文件实际上应该是项目目录中名为 "wsgi.py" 的文件(大概是 "apache",这对于明确不使用 Apache 的项目来说是一个奇怪的名称)。
"/": {
"type": "wsgi",
"module": "apache.wsgi",
"object": "application"
},
更新 所以我终于找到了 config docs:他们真的不竭尽全力让它变得简单,比如实际提供索引。好吧。
您似乎可以为路由器配置提供 options
散列,包括 pythonpath
设置:
"workers": [
{
"type": "router",
"options": {
"pythonpath": ["/var/myapp/myapp_main/", "/var/myapp"]
},
...
"transports": {
...
我正在试验 Crossbar.io 0.10.4 和 Django 1.6.11,试图遵循 example here。代码显示您可以配置 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。尝试相对导入失败(需要指定 "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()
----更新 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/')
看来应该有更好的方法...
错误告诉您设置中的文件路径指向您的 WSGI 文件,而您需要 Python 模块路径。您的 WSGI 文件实际上应该是项目目录中名为 "wsgi.py" 的文件(大概是 "apache",这对于明确不使用 Apache 的项目来说是一个奇怪的名称)。
"/": {
"type": "wsgi",
"module": "apache.wsgi",
"object": "application"
},
更新 所以我终于找到了 config docs:他们真的不竭尽全力让它变得简单,比如实际提供索引。好吧。
您似乎可以为路由器配置提供 options
散列,包括 pythonpath
设置:
"workers": [
{
"type": "router",
"options": {
"pythonpath": ["/var/myapp/myapp_main/", "/var/myapp"]
},
...
"transports": {
...