【问题标题】:Django Gunicorn wsgiDjango Gunicorn wsgi
【发布时间】:2012-09-09 11:16:51
【问题描述】:

您好,我正在尝试将我的 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 路径不对。
  • 把wsgi.py文件粘贴进去。应该是定义应用的地方
  • @moopet - 我什至不认为 wsgi.py 文件被调用,我如何让 gunicorn 选择那个文件?
  • 如果它是一个 Django 应用程序,你可以用gunicorn_django 开始它,而不是gunicorn
  • 使用gunicorn_django 也无济于事。另外,我在某处读到,当有人使用 Django1.4.x 时,最好使用gunicorn

标签: python django wsgi gunicorn


【解决方案1】:

您的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模块里面的变量application。您可以阅读有关Django provides you with the application object 的信息。

您可能需要将 gunicorn 指向 po.wsgi 模块本身。从目前提供的信息来看,有点难以判断。如果该模块被正确创建,它应该包含一个名为application的变量

【讨论】:

  • 感谢您的回答,我仍然遇到同样的错误。我认为 gunicorn 无法找到 wsgi.py 文件,因此未设置 application。我如何确保 gunicorn 知道 wsgi.py ?
  • 假设你的 wsgi.py 文件是 /home/code/po/po/wsgi.py 并且它包含一个名为 application 的 WSGI 应用程序,如果你从 shell 运行 export PYTHONPATH=/home/code/po; gunicorn -w 2 po.wsgi:application 会发生什么?
  • 把它交给你,最好是把它交给帮助过的人,而不是浪费声誉......
  • 谢谢 Srikar,你最后搞定了吗?你想发布你的解决方案吗?
【解决方案2】:

检查您安装的另一个软件包是否已经包含名为 wsgi.py 的文件。 (gevent 确实如此。)如果是这样,很可能正在加载错误的 wsgi.py 文件。尝试将您的 wsgi.py 文件重命名为其他文件(例如 app_wsgi.py)并添加运行您的应用程序使用

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

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 2015-10-01
    • 2017-02-16
    • 2013-03-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多