2017-11-07 3 views
2

다운로드하는 파일 일 때 필요하며 디렉토리에 액세스 할 때 누구든지 나를 도울 수 있습니까? 때문에 나는 그것을 가져 폴더/파이썬/파이썬/디렉토리로 이동/디렉토리에게 단지/파이썬받는 /Python/ 추가하고파일 다운로드 및 디렉토리 액세스 Python (web.py) + HTML

감사

#!/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

귀하 데프 GET을()을 떠나 같은 접근을하지 않는 경우 모든 URL의 시작. GET /이기 때문에 처음 작동하며 /Python/ 디렉토리에서 사용자에게 목록을 반환합니다.

그러나 항목 중 하나를 클릭하면 반환 된 HTML에서 "foo"라고 말하면 GET /Python/foo이됩니다. 그런 다음 다시 코드에 /Python이 추가되어 /Python/Python/foo을 찾습니다. 하나의 아이디어는 들어오는 경로가 '/'인 경우에만 '/ Python'을 추가하는 것입니다.

당신은하지만, 현재의 접근 방식과 몇 가지 다른 문제를 볼 수 있습니다

if path == '': 
    path = '/Python/' + path 
else: 
    path = '/' + path 

와 GET에서 첫 번째 라인()을 교체합니다.

먼저 보안을 고려하십시오. 사용자가 파일을 요청할 수있게하여 전체 서버에 대한 액세스 권한을 부여합니다. ,

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() 
+0

덕분에 그것을 넣어,하지만 어떻게 예/파이썬/파이썬/foo는 표시되지 내 코드에 적용? 이해할 수 없었습니다./ – TheGarden

+0

해결책을 업데이트했습니다. – pbuck

+0

대단히 고맙습니다. 그것에 대해 생각해 보지 않았습니다. 내게 많은 도움이되었습니다. 감사합니다. – TheGarden