Django Gunicorn wsgi

3

你好,我正在尝试将我的Django 1.4.1应用程序与Gunicorn 0.14.6集成。我可以通过命令行启动Gunicorn服务器:

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 文件了,我需要改变它吗?

更新:这是我的 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 选择这个文件?


你能否也添加 gunicorn_config.py 文件。看起来你的 wsgi.py 路径不正确。 - yilmazhuseyin
将 wsgi.py 文件粘贴到应用程序定义的位置。 - moopet
@moopet - 我甚至不认为 wsgi.py 文件被调用了,我该如何让 gunicorn 选择那个文件? - Srikar Appalaraju
如果是Django应用程序,您可以使用gunicorn_django启动它,而不是gunicorn - mipadi
使用 gunicorn_django 也没有帮助。另外我在某处读到,当你使用 Django1.4.x 时最好使用 gunicorn - Srikar Appalaraju
2个回答

2
您的django_settings设置不正确。django_settings应该是一个Python模块导入形式,可以从您设置的Python路径中导入。因此,应该像这样设置:
pythonpath = '/home/code/po'
django_settings = 'po.settings'

更详细地说,application是默认变量(应该是一个WSGI应用程序对象),gunicorn将尝试从您提供的Python模块中导入它。
所以换一种思考方式。假设您正在尝试运行一个简单的Flask wsgi应用程序。实际的WSGI应用程序被定义为application,并存储在/home/code/views.py中。然后以下内容将手动使用gunicorn开始服务。
export PYTHONPATH=/home/code
gunicorn -w 2 views:application

所以在views模块内部的变量应用。你可以了解到Django如何提供应用对象
可能需要将gunicorn指向po.wsgi模块本身。根据目前提供的信息,很难确定。如果该模块被正确创建,它应该包含一个名为application的变量。

谢谢你的答复,但我还是遇到了同样的错误。我想 gunicorn 找不到 wsgi.py 文件,因此 application 没有被设置。我该如何确保 gunicorn 知道 wsgi.py 的存在? - Srikar Appalaraju
假设您的 wsgi.py 文件位于 /home/code/po/po/wsgi.py,其中包含名为 application 的 WSGI 应用程序,如果您从 shell 运行 export PYTHONPATH=/home/code/po; gunicorn -w 2 po.wsgi:application,会发生什么? - aychedee
把它交给你,因为把声誉浪费掉不如送给帮助过你的人... - Srikar Appalaraju
谢谢Srikar,最终你解决了吗?你想发布你的解决方案吗? - aychedee

0

检查您已安装的其他软件包是否已经包含名为wsgi.py的文件。(gevent有这个文件。)如果是这样,可能会加载错误的wsgi.py文件。尝试将您的wsgi.py文件重命名为其他名称(例如app_wsgi.py),然后使用以下命令运行您的应用程序:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接