2016-11-27 11 views
2
  1. 그래서 모든 URL을 "/ files"로 시작하고 싶습니다.비 기본 루트 트위스티드 HTTP

  2. "localhost : 3000/files"에있는 루트 페이지는 공유 할 특정 폴더 목록을 반환합니다. 기본 공유는 공유 할 폴더를 제한하지 않습니다.

  3. 폴더로 이동할 때 폴더의 모든 파일을 표시하려고합니다. "localhost : 3000/files/Documents"와 같은 URL을 사용하십시오.

  4. 폴더의 특정 폴더와 파일을 재귀 적으로 공유하려고합니다. "localhost : 3000/files/Documents/Filename.pdf"와 같은 URL을 사용하십시오.

    from twisted.web.server import Site 
    from twisted.web.resource import Resource 
    from twisted.web.static import File 
    from twisted.internet import reactor 
    
    folder_list = ["Documents", "Downloads"] 
    
    
    class RootPage(Resource): 
        isLeaf = True 
        def render_GET(self, request): 
         print request.uri 
         new_request = request.uri[7:] 
         if len(new_request) <= 3: 
          ret = "" 
          for folders in folder_list: 
           ret += "<a href='%s'>%s</a></br>" % ("/files/" + folders.replace(" ", "-") , folders) 
          return ret 
    
    root = Resource()    
    #folders 
    root.putChild('files', RootPage()) 
    
    for folders in folder_list: 
        root.putChild(folders.replace(" ", "-"), File("/home/user1/" + folders)) 
    
    factory = Site(root) 
    
    reactor.listenTCP(3000, factory) 
    reactor.run() 
    

답변

2

문제

1) .putChild() 호출에서, 당신은 루트의 자녀, /files 아닌 아이들과 같이 폴더의 URL을 설정합니다.

2) RootPage 클래스 정의에서 isLeafTrue으로 설정합니다. 그러나 리프 노드가 아닌 내부 노드를 만들고 있습니다.


솔루션

isLeaf 라인을 삭제하고 여기에 다른 관련 라인을 변경 :

root = Resource() 
rootpage = RootPage() 
#folders 
root.putChild('files', rootpage) 

for folders in folder_list: 
    rootpage.putChild(folders.replace(" ", "-"), File("/home/user1/" + folders)) 

factory = Site(root) 
+0

작품 완벽하게 감사합니다. – GeneralZero