2009-10-08 12 views
22

Chciałbym zaimplementować w mojej aplikacji element funkcji, który ładuje i manipuluje plikami na serwerze WebDAV. Szukam dojrzałej biblioteki Pythona, która dałaby interfejs podobny do modułów os.* do pracy ze zdalnymi plikami. Googling okazał się niewielkim wyborem opcji dla WebDAV w Pythonie, ale chciałbym się dowiedzieć, które z nich są obecnie szersze.Biblioteka klienta Pythona dla WebDAV

Odpowiedz

1

Nie znam konkretnego, ale w zależności od platformy może być łatwiejsze podłączenie i dostęp do plików obsługiwanych przez WebDAV za pośrednictwem systemu plików. Jest tam davfs2, a niektóre systemy operacyjne, takie jak Mac OS X, mają wbudowaną obsługę systemu plików WebDAV.

+0

Tak, to z pewnością kolejna opcja. Jeśli mam zamiar go zamontować, równie dobrze mógłbym użyć NFS, ale przede wszystkim to, czego starałem się uniknąć, to użycie WebDAV. –

+0

+1 dla rozwiązania mocowania. Jest to uniksowy sposób rozwiązywania takich problemów. @Kamil Jakie były twoje argumenty przeciwko montowaniu, więc zdecydowałeś się znaleźć bibliotekę WebDAV? –

+1

-1 Montaż sieciowych systemów plików takich jak s3, dav, sshfs, które nie zostały zbudowane z myślą o takim użyciu (w porównaniu z NFS/SMB) są nieodłącznym źródłem problemów w praktyce. Przejściowe błędy sieciowe są zwykle bardzo słabo przekazywane do aplikacji lub powodują blokady. Dostęp do wzorców nieprzewidzianych przez programistę sterowników wymaga rozległych uścisków dłoni z serwerem, a tym samym niedopuszczalnych opóźnień, a inne pamięci podręczne zwykle powodują niespójności. – Juraj

9

Właśnie Miał podobną potrzebę i zakończył testowanie kilku klientów WebDAV Pythona dla moich potrzeb (przesyłanie i pobieranie plików z serwera WebDAV). Oto podsumowanie mojego doświadczenia:

1) Ten, który zadziałał dla mnie to python-webdav-lib.

Niezbyt dużo dokumentacji, ale szybkie spojrzenie na kod (w szczególności przykład) wystarczyło, aby dowiedzieć się, jak sprawić, by działało to dla mnie.

2) PyDAV 0.21 (najnowsza wersja, którą znalazłem) nie działa z Pythonem 2.6, ponieważ używa łańcuchów jako wyjątków. Nie próbowałem tego naprawić, spodziewając się później dalszych niezgodności.

3) davclient 0.2.0. Patrzyłem na to, ale nie zgłębiałem, ponieważ w dokumentacji nie wspomniano o poziomie API, którego szukałem (przesyłanie i pobieranie plików).

4) Python_WebDAV_Library-0.3.0. Wygląda na to, że nie ma żadnej funkcji przesyłania.

+1

thx do analizy, prawdopodobnie niektóre rzeczy zmieniły sice - 1) python-webdav-lib i Python_WebDAV_Library-0.3.0 są identyczne – mykhal

+2

Python-webdav-lib wymienione powyżej - działało bardzo dobrze dla mnie i było o wiele lepsze/bardziej przydatna odpowiedź niż zaakceptowany. –

43

To smutne, że na to pytanie ("Jakiej biblioteki internetowej Python się posługiwać?"), Które z pewnością dotyczy więcej niż jednej osoby, przyjęto niepowiązaną odpowiedź ("nie używaj biblioteki webdav Pythona"). Cóż, powszechny problem z Stackexchange.

Dla osób, które będą szukały prawdziwych odpowiedzi i podają wymagania w pierwotnym pytaniu (prosty interfejs API podobny do modułu "os"), mogę zasugerować easywebdav, który ma bardzo łatwe API, a nawet ładną i prostą implementację, oferowanie przesyłania/pobierania oraz kilka metod zarządzania plikami/serwerami. Ze względu na prostą implementację, do tej pory nie obsługuje listingów katalogu, ale błąd w tym był filed, a autor zamierza go dodać.

+2

Wykaz aukcji został zaimplementowany, jak widać https://github.com/amnong/easywebdav/pull/4. – Impiastro

+0

Ta biblioteka działa świetnie. Po prostu przetestowano na Mavericks: ls, download, upload i jest nawet prywatna funkcja "send", dzięki czemu możesz wysyłać dowolne żądania pobierania. Działa dla mnie i to jest pyton :) – chrisallick

+1

Niestety nie ma obsługi Pythona 3, a żądania ściągania nie są przetwarzane. Nadal szukam dobrej alternatywy ... – blootsvoets

2
import easywebdav 

webdav = easywebdav.connect(
    host='dav.dumptruck.goldenfrog.com', 
    username='_snip_', 
    port=443, 
    protocol="https", 
    password='_snip_') 

_file = "test.py" 

print webdav.cd("/dav/") 
# print webdav._get_url("") 
# print webdav.ls() 
# print webdav.exists("/dav/test.py") 
# print webdav.exists("ECS.zip") 
# print webdav.download(_file, "./"+_file) 
print webdav.upload("./test.py", "test.py") 
0

Instalacja:

$ sudo apt-get install libxml2-dev libxslt-dev python-dev 
$ sudo apt-get install libcurl4-openssl-dev python-pycurl 
$ sudo easy_install webdavclient 

Przykłady:

import webdav.client as wc 

options = { 
    'webdav_hostname': "https://webdav.server.ru", 
    'webdav_login': "login", 
    'webdav_password': "password" 
} 

client = wc.Client(options) 

client.check("dir1/file1") 
client.info("dir1/file1") 

files = client.list() 
free_size = client.free() 

client.mkdir("dir1/dir2") 
client.clean("dir1/dir2") 

client.copy(remote_path_from="dir1/file1", remote_path_to="dir2/file1") 
client.move(remote_path_from="dir1/file1", remote_path_to="dir2/file1") 

client.download_sync(remote_path="dir1/file1", local_path="~/Downloads/file1") 
client.upload_sync(remote_path="dir1/file1", local_path="~/Documents/file1") 
client.download_async(remote_path="dir1/file1", local_path="~/Downloads/file1", callback=callback) 
client.upload_async(remote_path="dir1/file1", local_path="~/Documents/file1", callback=callback) 

link = client.publish("dir1/file1") 
client.unpublish("dir1/file1") 

Linki:

Powiązane problemy