How can I connect to owncloud with python using easywebdav?

匿名 (未验证) 提交于 2019-12-03 02:50:02

问题:

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 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!