如何使用 WSGI 进行部署
Django's primary deployment platform is WSGI, the Python standard for webservers and applications.
Django's startproject
management command sets up a simple defaultWSGI 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:
- How to use Django with Apache and
mod_wsgi
- Authenticating against Django's user database from Apache
- 如何配合Gunicorn去部署Django
- How to use Django with uWSGI
The application object
The key concept of deploying with WSGI is the application
callable whichthe application server uses to communicate with your code. It's commonlyprovided as an object named application
in a Python module accessible tothe 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 WSGIdeployments.
WSGI servers obtain the path to the application
callable from theirconfiguration. Django's built-in server, namely the runserver
command, reads it from the WSGI_APPLICATION
setting. By default, it'sset to <project_name>.wsgi.application
, which points to the application
callable in <project_name>/wsgi.py
.
配置 settings 模块
When the WSGI server loads your application, Django needs to import thesettings module — that's where your entire application is defined.
Django uses the DJANGO_SETTINGS_MODULE
environment variable tolocate the appropriate settings module. It must contain the dotted path to thesettings 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 tomysite.settings
, where mysite
is the name of your project. That's howrunserver
discovers the default settings file by default.
Note
Since environment variables are process-wide, this doesn't work when yourun 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 itsown daemon process, or override the value from the environment byenforcing os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
inyour wsgi.py
.
应用 WSGI 中间件
To apply WSGI middleware you can simply wrap the application object. Forinstance 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 WSGIapplication that later delegates to the Django WSGI application, if you wantto combine a Django application with a WSGI application of another framework.