文件下载和目录访问 Python(web.py) + HTML
File Download and Directory Access Python(web.py) + HTML
我需要它,当它是一个文件时它会下载,当它是一个目录时它会访问该目录,有人可以帮助我吗?因为当我转到一个文件夹时,它会得到 /Python/Python/directory 并且无法访问,就像只保留它 /python/directory
谢谢
#!/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()
您的 def GET() 将 /Python/
添加到每个 URL 的开头。这是第一次工作,因为你 GET /
,它 returns 你是 /Python/
目录中的列表。
但是,当您单击其中一项时,在返回的 HTML 中说 "foo",您正在执行 GET /Python/foo
。然后,您的代码再次添加了另一个 /Python
,因此它正在查看 /Python/Python/foo
。一种想法是仅当传入路径为“/”时才添加“/Python”。
将 GET() 下的第一行替换为
if path == '':
path = '/Python/' + path
else:
path = '/' + path
不过,您会发现当前方法存在一些其他问题。
首先,考虑安全性。您通过允许用户请求文件来授予对整个服务器的访问权限。因此,请确保您的 python 检查生成的路径仍在您的沙箱中:
if not os.path.normpath(path).startswith('/Python/'):
return 'Error'
其次,考虑如果用户 select 有一个文件会发生什么。您的代码将尝试:
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....
最后,如果有人select一个文件,怎么办?将其放入您的 else:
else:
return open(path, 'r').read()
我需要它,当它是一个文件时它会下载,当它是一个目录时它会访问该目录,有人可以帮助我吗?因为当我转到一个文件夹时,它会得到 /Python/Python/directory 并且无法访问,就像只保留它 /python/directory
谢谢
#!/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()
您的 def GET() 将 /Python/
添加到每个 URL 的开头。这是第一次工作,因为你 GET /
,它 returns 你是 /Python/
目录中的列表。
但是,当您单击其中一项时,在返回的 HTML 中说 "foo",您正在执行 GET /Python/foo
。然后,您的代码再次添加了另一个 /Python
,因此它正在查看 /Python/Python/foo
。一种想法是仅当传入路径为“/”时才添加“/Python”。
将 GET() 下的第一行替换为
if path == '':
path = '/Python/' + path
else:
path = '/' + path
不过,您会发现当前方法存在一些其他问题。
首先,考虑安全性。您通过允许用户请求文件来授予对整个服务器的访问权限。因此,请确保您的 python 检查生成的路径仍在您的沙箱中:
if not os.path.normpath(path).startswith('/Python/'):
return 'Error'
其次,考虑如果用户 select 有一个文件会发生什么。您的代码将尝试:
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....
最后,如果有人select一个文件,怎么办?将其放入您的 else:
else:
return open(path, 'r').read()