2012-09-17 129 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