2012-09-17 95 views
3

嗨我正在尝试将我的django 1.4.1应用程序与Gunicorn 0.14.6集成。我开始在命令行gunicorn服务器就像这样 -Django Gunicorn wsgi

gunicorn -c /home/code/gunicorn_config.py 

我得到这个回溯 -

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 459, in spawn_worker 
    worker.init_process() 
    File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 99, in init_process 
    self.wsgi = self.app.wsgi() 
    File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/base.py", line 101, in wsgi 
    self.callable = self.load() 
    File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 24, in load 
    return util.import_app(self.app_uri) 
    File "/usr/local/lib/python2.7/dist-packages/gunicorn/util.py", line 292, in import_app 
    app = eval(obj, mod.__dict__) 
    File "<string>", line 1, in <module> 
NameError: name 'application' is not defined 

我在哪里去了?这是什么application变量&我需要在哪里修改?

此外,由于我使用Django1.4.1我有一个wsgi.py文件已经在我的项目,我需要改变这种状况?

UPDATE:这里是我的gunicorn_config.py文件的内容 -

import os 
import sys 
import multiprocessing 

def app_path(): 
    sys.path.append('/home/code/po/') 
    sys.path.append('/home/code/po/ball/') 
    return 

def num_cpus(): 
    cpus = 0 
    try: 
     cpus = os.sysconf("SC_NPROCESSORS_ONLN") 
    except: 
     cpus = multiprocessing.cpu_count() 

    if cpus: return cpus 
    else: return 3 

#defining the behavior of gunicorn 
app_path() 

bind  = "127.0.0.1:8080" 
workers = num_cpus()*2 + 1 
debug  = True 
daemon = False 
accesslog = '/home/code/logs/guni_access.log' 
errorlog = '/home/code/logs/guni_error.log' 
loglevel = 'debug' 
django_settings = '/home/code/po/po/' 
pythonpath  = '/home/code/po/' 

@moopet - 我甚至不认为wsgi.py文件被调用时,如何使gunicorn挑选文件?

+0

可以添加gunicorn_config.py文件太运行你的应用程序。看起来你的wsgi.py路径不对。 – yilmazhuseyin

+0

粘贴在wsgi.py文件它应该是一个应用程序定义 – moopet

+0

@moopet - 我甚至不认为'wsgi.py'文件被调用时,如何使gunicorn挑选文件? –

回答

2

django_settings不正确。 django_settings应该是可以从您设置的Python路径导入的python模块导入的形式。所以

pythonpath = '/home/code/po' 
django_settings = 'po.settings' 

更详细地说明了一点,application是默认的变量(这应该是一个WSGI应用对象)从您提供的Python模块gunicorn会尝试和进口。

所以去想它的另一种方式。假设你正在尝试运行一个简单的Flask wsgi appication。实际的WSGI应用被定义为application,并且住在/home/code/views.py之内。那么下面将手动启动与gunicorn服务它

export PYTHONPATH=/home/code 
gunicorn -w 2 views:application 

所以意见模块内部的变量应用。你可以阅读关于如何Django provides you with the application object

这可能是你需要在po.wsgi模块本身指向gunicorn。从目前提供的信息来看,有点难以分辨。如果该模块是正确创建它应该包含一个名为application

+0

感谢您的回答,我仍然得到同样的错误。我认为gunicorn无法找到wsgi.py文件,因此'application'没有设置。我如何确保gunicorn知道wsgi.py? –

+0

假设你的wsgi.py文件是'/ home/code/po/po/wsgi。py',它包含一个叫做'application'的WSGI应用程序,如果你运行'export PYTHONPATH =/home/code/po; gunicorn -w 2 po.wsgi:应用程序从壳? – aychedee

+0

给它,因为它更好地把它给一个谁帮助,而不是声誉要浪费的人... –

0

检查变量,如果您已经安装了其它软件包包含一个名为wsgi.py. (gevent的确如此。)如果是这样,可能会加载错误的wsgi.py文件。尝试重命名你的wsgi.py文件到别的东西(例如app_wsgi.py),并添加使用

gunicorn -c /home/code/gunicorn_config.py app_wsgi