How to deploy with ASGI

As well as WSGI, GingerDJ also supports deploying on ASGI, the emerging Python standard for asynchronous web servers and applications.

GingerDJ’s startproject management command sets up a default ASGI configuration for you, which you can tweak as needed for your project, and direct any ASGI-compliant application server to use.

GingerDJ includes getting-started documentation for the following ASGI servers:

The application object

Like WSGI, ASGI has you supply an 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>/asgi.py that contains such an application callable.

It’s not used by the development server (runserver), but can be used by any ASGI server either in development or in production.

ASGI servers usually take the path to the application callable as a string; for most GingerDJ projects, this will look like myproject.asgi:application.

Warning

While GingerDJ’s default ASGI handler will run all your code in a synchronous thread, if you choose to run your own async handler you must be aware of async-safety.

Do not call blocking synchronous functions or libraries in any async code. GingerDJ prevents you from doing this with the parts of GingerDJ that are not async-safe, but the same may not be true of third-party apps or Python libraries.

Configuring the settings module

When the ASGI server loads your application, GingerDJ needs to import the settings module — that’s where your entire application is defined.

GingerDJ uses the GINGER_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 asgi.py sets it to mysite.settings, where mysite is the name of your project.

Applying ASGI middleware

To apply ASGI middleware, or to embed GingerDJ in another ASGI application, you can wrap GingerDJ’s application object in the asgi.py file. For example:

from some_asgi_library import AmazingMiddleware

application = AmazingMiddleware(application)