问题
I'm trying to connect to a owncloud
instance with python.
I've found easywebdav
that should make it easy to connect via webdav, but when trying to connect I'm getting "404 Not Found"
import easywebdav
webdav = easywebdav.connect('test.org/owncloud/remote.php/webdav/', username='user', password='pass', protocol='https', port=443, verify_ssl=False)
print webdav.ls(".")
I would expect a list of files found on my owncloud instance, but I'm getting
python ./test.py
Traceback (most recent call last):
File "./test.py", line 8, in <module>
print webdav.ls(".")
File "/usr/lib/python2.7/site-packages/easywebdav-1.0.7-py2.7.egg/easywebdav/client.py", line 131, in ls
response = self._send('PROPFIND', remote_path, (207, 301), headers=headers)
File "/usr/lib/python2.7/site-packages/easywebdav-1.0.7-py2.7.egg/easywebdav/client.py", line 81, in _send
raise OperationFailed(method, path, expected_code, response.status_code)
easywebdav.client.OperationFailed: Failed to list directory ".".
Operation : PROPFIND .
Expected code : 207 UNKNOWN, 301 Moved Permanently
Actual code : 404 Not Found
What I find weird, is that if I connect to a invalid path, with
webdav = easywebdav.connect('test.org/owncloud-not-existent/', ......)
I get
Traceback (most recent call last):
File "./test.py", line 8, in <module>
print webdav.ls(".")
File "/usr/lib/python2.7/site-packages/easywebdav-1.0.7-py2.7.egg/easywebdav/client.py", line 131, in ls
response = self._send('PROPFIND', remote_path, (207, 301), headers=headers)
File "/usr/lib/python2.7/site-packages/easywebdav-1.0.7-py2.7.egg/easywebdav/client.py", line 81, in _send
raise OperationFailed(method, path, expected_code, response.status_code)
easywebdav.client.OperationFailed: Failed to list directory ".".
Operation : PROPFIND .
Expected code : 207 UNKNOWN, 301 Moved Permanently
Actual code : 405 Method Not Allowed
回答1:
I've tested with a personal WebDav server and I found a similar issue, although I think that my easywebdav version is different, I use v1.0.7 and the parameter verify_ssl
is not allowed, so I did the test with "http".
Anyway, I got to reproduce your issue, to fix it change the connection url and use only the host, putting the path in the ls()
command :
import easywebdav
webdav = easywebdav.connect('test.org', username='user', password='pass', protocol='https', port=443, verify_ssl=False)
print webdav.ls("/owncloud/remote.php/webdav")
回答2:
While the solution in the previous answer does work around the issue, it's less convenient to have to pass in the path on each command.
Digging deeper, it appears that owncloud simply doesn't support paths with '.' on the end. easywebdav actually has a default path of '.' for commands like ls() such that doing webdav.ls() should print the current directory, but as seen above you get an error instead.
Simply calling ls with a complete path works fine though, which is why the suggested answer above worked.
A simpler solution to the original question is:
import easywebdav
webdav = easywebdav.connect('test.org/owncloud/remote.php/webdav/', username='user', password='pass', protocol='https', port=443, verify_ssl=False)
print webdav.ls("/")
回答3:
connection = easywebdav.connect( 'something.tld',
username = 'your_username',
password = 'your_password',
protocol = 'https',
path = 'owncloud/remote.php/webdav',
verify_ssl = False) #not commended
connection.cd("my_folder")
connection.ls("") # Seafile's seafdav will return a 404 if you use the "." or ".." directory
来源:https://stackoverflow.com/questions/22555296/how-can-i-connect-to-owncloud-with-python-using-easywebdav