Skip to main content

azf-wsgi - WSGI apps on Azure Functions

DEPRECATION NOTICE: The Azure Functions team has built first-class support for WSGI on Azure Functions. I recommend you switch to their implementation.


This was an adapter package to let you run WSGI apps (Django, Flask, etc.) on Azure Functions.

Example:

import azure.functions as func

# note that the package is "azf-wsgi" but the import is "azf_wsgi"
from azf_wsgi import AzureFunctionsWsgi
# Django, for example, but works with any WSGI app
from my_django_app.wsgi import application


def main(req: func.HttpRequest, context: func.Context) -> func.HttpResponse:
    return AzureFunctionsWsgi(application).main(req, context)

Usage

Install Azure Functions

Follow the instructions here to get set up locally. I created a Function called "DjangoTrigger", but you can call yours whatever.

Install your WSGI app

I found it's easiest if you package your WSGI app using a setup.py script, then pip install it. If you don't want to do that, you'll have to make sure your WSGI entrypoint is importable from the module where you define your Azure Function. I'm no Python imports expert, so I just added sys.path.insert(0, './my_proj') right before I try to import the package.

Install this package

pip install azf-wsgi - no need to put this in Django's INSTALLED_APPS or anything like that. Be sure to update requirements.txt to include azf-wsgi as a requirement.

Configure Azure Functions to hand off to your WSGI app

First, we want to delegate routing to your WSGI app. Edit your function.json to include a catch-all route called "{*route}":

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ],
      "route": "app/{*route}"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}

I also didn't want the default 'api/' path on all my routes, so I fixed my host.json to look like this:

{
    "version":  "2.0",
    "extensions": {
        "http": {
            "routePrefix": ""
        }
    }
}

Without this configuration, the only paths your WSGI app would ever see would start with "api/<FunctionName>/". That works, but it would require you to repeat those boilerplate prefixes on every route you configured. However, you don't want to completely take over all routes (by having an empty routePrefix and a catch-all route in your function) because this disables important Azure machinery.

Finally, setup your Function's __init__.py to delegate to the WSGI adapter:

import azure.functions as func

from azf_wsgi import AzureFunctionsWsgi
from my_django_app.wsgi import application


def main(req: func.HttpRequest) -> func.HttpResponse:
    return AzureFunctionsWsgi(application).main(req)

The adapter optionally takes the Context object as well:

def main(req: func.HttpRequest, context: func.Context) -> func.HttpResponse:
    return AzureFunctionsWsgi(application).main(req, context)

The adapter will stuff in the OS's environment block much like a CGI request. If for some reason you don't want that, you can pass False to include_os_environ:

def main(req: func.HttpRequest, context: func.Context) -> func.HttpResponse:
    return AzureFunctionsWsgi(application, False).main(req, context)

Metadata

Release files for azf-wsgi 0.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for azf-wsgi 0.3.1
File Size Uploaded Provenance Actions
azf-wsgi-0.3.1.tar.gz 4.0 kB Without provenance Details for azf-wsgi-0.3.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for azf-wsgi 0.3.1
File Interpreter ABI Platform Actions
azf_wsgi-0.3.1-py3-none-any.whl Python 3 none any Details for azf_wsgi-0.3.1-py3-none-any.whl

Total release size: 9.3 kB

Release files / azf-wsgi-0.3.1.tar.gz

Download URL azf-wsgi-0.3.1.tar.gz
Size 4.0 kB
Tags Source
SHA-256 checksum
How to use checksums
85e508efe1d58e42ad4c4a3993d5a37608648fbb67f5525b7de6c91a64a08c17
BLAKE2b-256 checksum
How to use checksums
412a839c624faee7d740e5d9f25da5dc61e98c3bd4a5f1cccca53121e48938be
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.3

Release files / azf_wsgi-0.3.1-py3-none-any.whl

Download URL azf_wsgi-0.3.1-py3-none-any.whl
Size 5.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c271d982ebc1589399de04b2c35dc35c0dc9dda581bb7bfa851ac93947e16cd0
BLAKE2b-256 checksum
How to use checksums
6341541bfa89ee3431b91337cc1ce59c7cee034d2f49bb4530a2363573db79ee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.3

Security for azf-wsgi 0.3.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page