2017-02-20 15 views
1

Код здесь.Python скрученный putChild не пересылает ожидаемый

from twisted.web.static import File 
from twisted.web.server import Site 
from twisted.web.resource import Resource 
from twisted.internet import ssl, reactor 
from twisted.python.modules import getModule 
import secure_aes 
import urllib.parse 
import cgi 
import json 
import os 
import hashlib 
import coserver 
import base64 
import sim 

if not os.path.exists(os.path.join(os.getcwd(),'images')): 
    os.mkdir(os.path.join(os.getcwd(),'images')) 


with open ('form.html','r') as f: 
    fillout_form = f.read() 
with open ('image.html','r') as f: 
    image_output = f.read() 


port = 80#int(os.environ.get('PORT', 17995)) 
class FormPage(Resource): 
    #isLeaf = True 
    def getChild(self, name, request): 
     print('GC') 
     if name == '': 
      return self 
     return Resource.getChild(self, name, request) 


    def render_GET(self, request): 
     print(request) 
     #do stuff and return stuff 

root = FormPage() 
root.putChild('rcs', File("./images")) 
#factory = Site(FormPage()) 
factory = Site(root) 
reactor.listenTCP(port, factory) 
reactor.run() 

Как вы можете видеть, я root.putChild к концу вещей, ожидая, что, когда я добрался до http://site/rcs я получаю данный список каталогов содержимого ./images но, конечно, не бывает. Что мне не хватает? Я пробовал много вещей, предложенных от here. Кроме того, this one не работает, потому что это всегда служит для статических файлов. Он все время переходит к getChild независимо от того, задано ли putChild или нет.

+0

Я не могу воспроизвести проблему. Я удалил кучу посторонних вещей, но оставил ядро ​​нетронутым - и он служит для списка каталогов для меня. –

+0

Какая версия Twisted, Python, какая ОС и т. Д. –

+0

Python 3.5, Windows 10. Нет. – Luke

ответ

4

На Python 3 голой строковый литерал, такой как "rcs", является строкой unicode (которую Python 3 называет «str», но которую я назову «unicode», чтобы избежать неоднозначности).

Однако twisted.web.resource.Resource.putChild требует в качестве первого аргумента байтовой строки. Напротив, он плохо работает, если вместо него вводится уникод. Сделайте сегменты пути в байтовые строки (например, b"rcs"), и сервер будет лучше себя вести на Python 3.