Я пытаюсь составить список файлов с помощью webdab, но у меня возникают проблемы. Я могу создавать каталоги и помещать файлы, но не могу перечислить каталог или извлечь файл. Я вижу ошибку "Метод не поддерживается".
from webdav3.client import Client
options = {
'webdav_hostname': "https://___________.com/remote.php/dav/files/",
'webdav_login': "user_name",
'webdav_password': "password"
}
client = Client(options)
print(client.list('/'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/<user>/.local/lib/python3.10/site-packages/webdav3/client.py", line 67, in _wrapper
res = fn(self, *args, **kw)
File "/home/<user>/.local/lib/python3.10/site-packages/webdav3/client.py", line 264, in list
response = self.execute_request(action='list', path=directory_urn.quote())
File "/home/<user>/.local/lib/python3.10/site-packages/webdav3/client.py", line 228, in execute_request
raise MethodNotSupported(name=action, server=self.webdav.hostname)
webdav3.exceptions.MethodNotSupported: Method 'list' not supported for https://________.com/remote.php/dav/files
Несмотря на то, что имя пользователя уже указано в webdav_login, оно по-прежнему необходимо при вызове listdir
. Например, чтобы получить список файлов в корневом каталоге пользователя «имя_пользователя», client.list('/user_name/')
.
@SaaruLindestøkke Я только что попробовал, и все работает, как вы сказали. Опубликуйте это как ответ, и я приму его.
Метод client.list()
предполагает удаленный корневой каталог по умолчанию.
Поскольку вы указываете https://___________.com/remote.php/dav/files/
в качестве своего webdav_hostname
корневого каталога, к которому он пытается получить доступ, когда вы вызываете client.list('/')
, это каталог файлов верхнего уровня. Как пользователь Nextcloud, у вас нет доступа к этому уровню, поэтому перечислить его невозможно. Однако у вас есть доступ к каталогу files/<username>
, поэтому листинг client.list('/<username>/')
работает.
Чтобы предотвратить добавление имени пользователя к каждой команде списка, вы можете установить webdav_hostname
на .../remote.php/dav/files/<username>
. Тогда вызов client.list()
должен работать сразу.
Я не могу сейчас предлагать правки, поэтому комментарий. Решение кажется правильным, но это не потому, что вам нужно указать имя пользователя (метод list не имеет аргумента имени пользователя), а потому, что вам нужно указать корневую папку, которую необходимо указать, что в данном случае совпадает с Имя пользователя. Вероятно, это также можно решить, добавив имя пользователя после
..../dav/files/
в имя хоста webdav.