Загрузка файлов и доступ к каталогам Python(web.py) + HTML
Мне это нужно, когда это файл, который он загружает, и когда это каталог, к которому он обращается, может ли кто-нибудь мне помочь? потому что, когда я захожу в папку, она получает каталог / Python / Python / и не получает доступа, как если бы она оставляла только каталог /python/
Спасибо
#!/usr/bin/python
import web
import os
urls = (
'/(.*)', 'hello'
)
app = web.application(urls, globals())
class hello:
def GET(self, path):
path = '/Python/'+path
lista = '<html> <body>'
caminhos = [os.path.join(path, nome) for nome in os.listdir(path)]
diretorios = [dire for dire in caminhos if os.path.isdir(dire)]
for dire in diretorios:
# lista = lista+dire+'<br>'
lista = lista+'<a href='+dire+'>'+dire+'</a><br>'
arquivos = [arq for arq in caminhos if os.path.isfile(arq)]
for arq in arquivos:
lista = lista+'<a href='+arq+' target="_blank">'+arq+'</a><br>'
# lista = lista+arq+'<br>'
lista = lista+'<br><br><a href="javascript:window.history.go(-1)">Voltar</a></body> </html>'
return lista
if __name__ == "__main__":
app.run()
1 ответ
Ваш def GET() добавляет /Python/
в начале каждого URL. Это работает в первый раз, потому что вы GET /
и возвращает вам список из /Python/
каталог.
Однако, когда вы нажимаете на один из элементов, скажем "foo" в возвращаемом HTML, вы делаете GET /Python/foo
, Затем, опять же, ваш код добавляет еще один /Python
так это смотрит на /Python/Python/foo
, Одна идея состоит в том, чтобы добавить '/Python', только если входящий путь равен '/'.
Замените вашу первую строку в GET () на
if path == '':
path = '/Python/' + path
else:
path = '/' + path
Однако вы увидите некоторые другие проблемы с вашим текущим подходом.
Сначала рассмотрим безопасность. Вы предоставляете доступ ко всему вашему серверу, позволяя пользователю запрашивать файл. Итак, убедитесь, что ваш питон проверяет, что полученный путь все еще находится в вашей песочнице:
if not os.path.normpath(path).startswith('/Python/'):
return 'Error'
Во-вторых, подумайте, что произойдет, если пользователь выберет файл. Ваш код будет пытаться:
caminhos = [os.path.join(path, nome) for nome in os.listdir(path)]
который терпит неудачу, потому что путь не является каталогом. Итак, поместите весь этот код в оператор if:
if os.path.isdir(path):
caminhos = [os.path.join.....
...
lista = lista+'<br><br....
Наконец, если кто-то выбирает файл, что делать? Поместите это в свой else:
else:
return open(path, 'r').read()