Asyncio WebDAV client, based on original package https://github.com/ezhov-evgeny/webdav-client-python-3 but uses aiohttp instead of requests
Project description
aiowebdav
Package aiowebdav based on https://github.com/designerror/webdav-client-python but uses aiohttp
instead of requests
.
It provides easy way to work with WebDAV-servers.
Installation
$ pip install aiowebdav
Sample Usage
import asyncio
from aiowebdav.client import Client
options = {
'webdav_hostname': "https://webdav.server.ru",
'webdav_login': "login",
'webdav_password': "password",
"disable_check": True
}
async def main():
client = Client(options)
client.verify = False # To not check SSL certificates (Default = True)
client.execute_request("mkdir", 'directory_name')
asyncio.run(main())
Webdav API
Webdav API is a set of webdav actions of work with cloud storage. This set includes the following actions:
check
, free
, info
, list
, mkdir
, clean
, copy
, move
, download
, upload
, publish
and unpublish
.
Configuring the client
Required key is host name or IP address of the WevDAV-server with param name webdav_hostname
.
For authentication in WebDAV server use webdav_login
, webdav_password
.
For an anonymous login do not specify auth properties.
from aiowebdav.client import Client
options = {
'webdav_hostname': "https://webdav.server.ru",
'webdav_login': "login",
'webdav_password': "password"
}
client = Client(options)
If your server does not support HEAD
method or there are other reasons to override default WebDAV methods for actions use a dictionary option webdav_override_methods
.
The key should be in the following list: check
, free
, info
, list
, mkdir
, clean
, copy
, move
, download
, upload
,
publish
and unpublish
. The value should a string name of WebDAV method, for example GET
.
from aiowebdav.client import Client
options = {
'webdav_hostname': "https://webdav.server.ru",
'webdav_login': "login",
'webdav_password': "password",
'webdav_override_methods': {
'check': 'GET'
}
}
client = Client(options)
For configuring a requests timeout you can use an option webdav_timeout
with int value in seconds, by default the timeout is set to 30 seconds.
from aiowebdav.client import Client
options = {
'webdav_hostname': "https://webdav.server.ru",
'webdav_login': "login",
'webdav_password': "password",
'webdav_timeout': 30
}
client = Client(options)
When a proxy server you need to specify settings to connect through it.
from aiowebdav.client import Client
options = {
'webdav_hostname': "https://webdav.server.ru",
'webdav_login': "w_login",
'webdav_password': "w_password",
'webdav_proxy': "http://127.0.0.1:8080",
'webdav_proxy_auth': "xxx",
}
client = Client(options)
If you want to use the certificate path to certificate and private key is defined as follows:
from aiowebdav.client import Client
options = {
'webdav_hostname': "https://webdav.server.ru",
'webdav_login': "w_login",
'webdav_password': "w_password",
'webdav_ssl': 'sslcontext'
}
client = Client(options)
Or you want to limit the speed or turn on verbose mode:
options = {
...
'recv_speed' : 3000000,
'send_speed' : 3000000,
'verbose' : True
}
client = Client(options)
recv_speed: rate limit data download speed in Bytes per second. Defaults to unlimited speed.
send_speed: rate limit data upload speed in Bytes per second. Defaults to unlimited speed.
verbose: set verbose mode on/off. By default verbose mode is off.
Also if your server does not support check
it is possible to disable it:
options = {
...
'disable_check': True
}
client = Client(options)
By default, checking of remote resources is enabled.
For configuring chunk size of content downloading use chunk_size
param, by default it is 65536
options = {
...
'chunk_size': 65536
}
client = Client(options)
Asynchronous methods
# Checking existence of the resource
await client.check("dir1/file1")
await client.check("dir1")
# Get information about the resource
await client.info("dir1/file1")
await client.info("dir1/")
# Check free space
free_size = await client.free()
# Get a list of resources
files1 = await client.list()
files2 = await client.list("dir1")
files3 = await client.list("dir1", get_info=True) # returns a list of dictionaries with files details
# Create directory
await client.mkdir("dir1/dir2")
# Delete resource
await client.clean("dir1/dir2")
# Copy resource
await client.copy(remote_path_from="dir1/file1", remote_path_to="dir2/file1")
await client.copy(remote_path_from="dir2", remote_path_to="dir3")
# Move resource
await client.move(remote_path_from="dir1/file1", remote_path_to="dir2/file1")
await client.move(remote_path_from="dir2", remote_path_to="dir3")
# Download a resource
await client.download(remote_path="dir1/file1", local_path="~/Downloads/file1")
await client.download(remote_path="dir1/dir2/", local_path="~/Downloads/dir2/")
# Upload resource
await client.upload(remote_path="dir1/file1", local_path="~/Documents/file1")
await client.upload(remote_path="dir1/dir2/", local_path="~/Documents/dir2/")
# Publish the resource
link = await client.publish("dir1/file1")
link = await client.publish("dir2")
# Unpublish resource
await client.unpublish("dir1/file1")
await client.unpublish("dir2")
# Exception handling
from aiowebdav.exceptions import WebDavException
try:
...
except WebDavException as exception:
...
# Get the missing files
await client.pull(remote_directory='dir1', local_directory='~/Documents/dir1')
# Send missing files
await client.push(remote_directory='dir1', local_directory='~/Documents/dir1')
# Unload resource
kwargs = {
'remote_path': "dir1/file1",
'local_path': "~/Downloads/file1",
'callback': callback
}
client.upload_async(**kwargs)
kwargs = {
'remote_path': "dir1/dir2/",
'local_path': "~/Downloads/dir2/",
'callback': callback
}
client.upload_async(**kwargs)
Resource API
Resource API using the concept of OOP that enables cloud-level resources.
# Get a resource
res1 = client.resource("dir1/file1")
# Work with the resource
await res1.rename("file2")
await res1.move("dir1/file2")
await res1.copy("dir2/file1")
info = await res1.info()
await res1.read_from(buffer)
await res1.read(local_path="~/Documents/file1")
await res1.write_to(buffer)
await res1.write(local_path="~/Downloads/file1")
For Contributors
Prepare development environment
- Install docker on your development machine
- Start WebDAV server for testing by following commands from the project's root folder or change path to
conf
dir in second command to correct:
docker pull bytemark/webdav
docker run -d --name webdav -e AUTH_TYPE=Basic -e USERNAME=alice -e PASSWORD=secret1234 -v conf:/usr/local/apache2/conf -p 8585:80 bytemark/webdav
Code convention
Please check your code according PEP8 Style guides.
Run tests
- Check that webdav container is started on your local machine
- Execute following command in the project's root folder:
python -m unittest discover -s tests
Prepare a Pull Request
Please use this check list before creating PR:
- You code should be formatted according PEP8
- All tests should successfully pass
- Your changes shouldn't change previous default behaviour, exclude defects
- All changes are covered by tests
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file aiowebdav-0.1.0rc3.tar.gz
.
File metadata
- Download URL: aiowebdav-0.1.0rc3.tar.gz
- Upload date:
- Size: 24.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.9.0 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 035e7e72a86bba75d1b9412037522441ba3d70f9352d896effd87a7c72e3e846 |
|
MD5 | 3e61b9cce105f1002b55c9d02e0d099b |
|
BLAKE2b-256 | d6f7327c09925499d082ce7dd296ce962543c6d114ee7b6b2270421e658c6e1c |
File details
Details for the file aiowebdav-0.1.0rc3-py3-none-any.whl
.
File metadata
- Download URL: aiowebdav-0.1.0rc3-py3-none-any.whl
- Upload date:
- Size: 22.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.9.0 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d6b29665d0a3a9f5ce9b763576d0cf8f6b7c7caa4c247fbe6b82da75ccd5edec |
|
MD5 | 858c4c90c0e89c65a706b91925395e47 |
|
BLAKE2b-256 | e0a05dd57adaf604041a1b54755b42575a3c306f32dd5d27b70badb93458f3eb |