WSGI middleware that finds the registered mapped DAV-Provider, creates a new RequestServer instance, and dispatches the request.


The following documentation was taken over from PyFileServer and is outdated.

WsgiDAV file sharing

WsgiDAV allows the user to specify in wsgidav.conf a number of realms, and a number of users for each realm.


Each realm corresponds to a filestructure on disk to be stored, for example:


would allow the users to access using WebDAV the directory/file structure at /home/public/share from the url http://<servername:port>/<approot>/pubshare

The realm name is set as ‘/pubshare’

e.g. /home/public/share/WsgiDAV/LICENSE becomes accessible as http://<servername:port>/<approot>/pubshare/WsgiDAV/LICENSE


A number of user_name/password pairs can be set for each realm:

adduser('pubshare', 'user_name', 'password', 'description/unused')

would add a user_name/password pair to realm /pubshare.

Note: if developers wish to maintain a separate users database, you can write your own domain controller for the HTTPAuthenticator. See and for more details.

Request Resolver

WSGI middleware for resolving Realm and Paths for the WsgiDAV application.


It must be configured as the last item on middleware_stack list.

from wsgidav.request_resolver import RequestResolver config = {

…, ‘middleware_stack’: [

…, RequestResolver,



The RequestResolver resolves the requested URL to the following values placed in the environ dictionary. First it resolves the corresponding realm:

url: http://<servername:port>/<approot>/pubshare/WsgiDAV/LICENSE
environ['wsgidav.mappedrealm'] = /pubshare

Based on the configuration given, the resource abstraction layer for the realm is determined. if no configured abstraction layer is found, the default abstraction layer fileabstractionlayer.FilesystemAbstractionLayer() is used:

environ['wsgidav.resourceAL'] = fileabstractionlayer.MyOwnFilesystemAbstractionLayer()

The path identifiers for the requested url are then resolved using the resource abstraction layer:

environ['wsgidav.mappedpath'] = /home/public/share/WsgiDAV/LICENSE
environ['wsgidav.mappedURI'] = /pubshare/WsgiDAV/LICENSE

in this case, FilesystemAbstractionLayer resolves any relative paths to its canonical absolute path

The RequestResolver also resolves any value in the Destination request header, if present, to:

Destination: http://<servername:port>/<approot>/pubshare/WsgiDAV/LICENSE-dest
environ['wsgidav.destrealm'] = /pubshare
environ['wsgidav.destpath'] = /home/public/share/WsgiDAV/LICENSE-dest
environ['wsgidav.destURI'] = /pubshare/WsgiDAV/LICENSE
environ['wsgidav.destresourceAL'] = fileabstractionlayer.MyOwnFilesystemAbstractionLayer()


RequestResolver(wsgidav_app, next_app, config)

Other Members

BaseMiddleware(wsgidav_app, next_app, config) Abstract base middleware class (optional).
DAVError(status_code[, context_info, …]) General error class that is used to signal HTTP and WEBDAV errors.
HTTP_NOT_FOUND int(x=0) -> int or long int(x, base=10) -> int or long
util Miscellaneous support functions for WsgiDAV.