Загрузка файлов и доступ к каталогам 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()
Другие вопросы по тегам