How to deploy with WSGI
Django’s startproject management command sets up a minimal default WSGI configuration for you, which you can tweak as needed for your project, and direct any WSGI-compliant application server to use.
Django includes getting-started documentation for the following WSGI servers:
The key concept of deploying with WSGI is the application
callable which the application server uses to communicate with your code. It’s commonly provided as an object named application
in a Python module accessible to the server.
The command creates a file <project_name>/wsgi.py
that contains such an callable.
WSGI servers obtain the path to the application
callable from their configuration. Django’s built-in server, namely the runserver command, reads it from the setting. By default, it’s set to <project_name>.wsgi.application
, which points to the application
callable in <project_name>/wsgi.py
.
When the WSGI server loads your application, Django needs to import the settings module — that’s where your entire application is defined.
Django uses the DJANGO_SETTINGS_MODULE environment variable to locate the appropriate settings module. It must contain the dotted path to the settings module. You can use a different value for development and production; it all depends on how you organize your settings.
If this variable isn’t set, the default sets it to mysite.settings
, where mysite
is the name of your project. That’s how discovers the default settings file by default.
Since environment variables are process-wide, this doesn’t work when you run multiple Django sites in the same process. This happens with mod_wsgi.
To avoid this problem, use mod_wsgi’s daemon mode with each site in its own daemon process, or override the value from the environment by enforcing os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
in your wsgi.py
.
To apply WSGI middleware you can wrap the application object. For instance you could add these lines at the bottom of :
You could also replace the Django WSGI application with a custom WSGI application that later delegates to the Django WSGI application, if you want to combine a Django application with a WSGI application of another framework.