Django Gunicorn wsgi

2019-02-18 22:04发布

问题:

Hi I am trying to integrate my django 1.4.1 app with Gunicorn 0.14.6. I start gunicorn server from command line like so -

gunicorn -c /home/code/gunicorn_config.py

I get this traceback -

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

Where am i going wrong? Whats this application variable & where do I need to modify this?

Also since I am using Django1.4.1 I have a wsgi.py file already in my project, do I need to change that?

UPDATE: here is my gunicorn_config.py file contents -

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 - i dont even think that wsgi.py file is called, how do i make gunicorn pick that file ?

回答1:

Your django_settings is incorrect. django_settings should be in the form of a python module import that is importable from the Python path you set. So

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

To elaborate a bit more, application is the default variable (which should be a WSGI application object) gunicorn will try and import from the Python module that you supply.

So to think about it another way. Say you were trying to run a simple Flask wsgi appication. The actual WSGI app was defined as application and lived inside /home/code/views.py. Then the following would manually start serving it with gunicorn

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

So the variable application inside the views module. You can read about how Django provides you with the application object.

It might be that you need to point gunicorn at the po.wsgi module itself. It's a little hard to tell from the information provided so far. If that module was created properly it should contain a variable called application



回答2:

Check if another package you have installed already contains a file called wsgi.py. (gevent does.) If so, likely the wrong wsgi.py file is being loaded. Try renaming your wsgi.py file to something else (e.g. app_wsgi.py) and add run your app using

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