Using the Library#

This section describes how to use the wsgidav package to implement custom WebDAV servers.

Todo

This documentation is still under construction.

The wsgidav package can be used in Python code:

$ python
>>> from wsgidav import __version__
>>> __version__
'2.3.1'

Run Inside a WSGI Server#

The WsgiDAV server was tested with these WSGI servers:

In order to run WsgiDAV, we need to create an instance of WsgiDAVApp, pass options, and mount it on a WSGI compliant web server.
Here we keep most of the default options and use the cheroot WSGI server

from cheroot import wsgi
from wsgidav.wsgidav_app import WsgiDAVApp

config = {
    "host": "0.0.0.0",
    "port": 8080,
    "provider_mapping": {
        "/": "/Users/joe/pub",
      },
    "verbose": 1,
  }
app = WsgiDAVApp(config)

server_args = {
    "bind_addr": (config["host"], config["port"]),
    "wsgi_app": app,
}
server = wsgi.Server(**server_args)

try:
    server.start()
except KeyboardInterrupt:
    print("Received Ctrl-C: stopping...")
finally:
    server.stop()

Options are passed as Python dict, see the Configuration for details.

By default, the FilesystemProvider is used. This provider creates instances of FileResource and FolderResource to represent files and directories respectively.

This is why the example above will publish the directory /User/joe/pub as http://HOST:8080/.

See the wsgidav.server.server_cli.py for more examples.

Custom Providers#

If we want to implement custom behavior, we can define our own variant of a (derived from DAVProvider), which typically also uses custom instances of DAVNonCollection and DAVCollection.

...
from bar_package import FooProvider
...
config = {
    "host": "0.0.0.0",
    "port": 8080,
    "provider_mapping": {
        "/dav": FooProvider(),
    },
    "verbose": 1,
}
app = WsgiDAVApp(config)
...

Logging#

By default, the library initializes and uses a python logger named ‘wsgidav’ and sub-loggers named like ‘wsgidav.wsgidav_app’, etc.

By default, the wsgidav logger only has a NullHandler assigned and does not propagate to the root logger, so it is silent.

This logger can be enabled like so:

config = {
    ...
    logging: {
        "enable": True,
    }
}
app = WsgiDAVApp(config)
...

Note

Prior to v4.3.0 an application had to call wsgidav.util.init_logging(config) explicitly.

Note

The CLI calls util.init_logging() on startup, so it logs to stdout as configured by the verbose and logging.enable_loggers options.