How to deploy with WSGIΒΆ
Djangoβs primary deployment platform is WSGI, the Python standard for web servers and applications.
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 application
objectΒΆ
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 startproject
command creates a file
<project_name>/wsgi.py
that contains such an application
callable.
Itβs used both by Djangoβs development server and in production WSGI deployments.
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 WSGI_APPLICATION
setting. By default,
itβs set to <project_name>.wsgi.application
, which points to the
application
callable in <project_name>/wsgi.py
.
Configuring the settings moduleΒΆ
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 wsgi.py
sets it to
mysite.settings
, where mysite
is the name of your project. Thatβs how
runserver
discovers the default settings file by default.
Note
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
.
Applying WSGI middlewareΒΆ
To apply WSGI middleware you can wrap the application
object. For instance you could add these lines at the bottom of
wsgi.py
:
from helloworld.wsgi import HelloWorldApplication
application = HelloWorldApplication(application)
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.