2017-02-20 22 views
1

ここにコードがあります。Python twisted 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() 

あなたが見ることができるように、私は私がhttp://site/rcsに着いたとき、私は./imagesの内容のディレクトリ一覧を与えますが、もちろん起こらないことを期待し、物事の終わりに向かってroot.putChildをしました。私は何が欠けていますか?私はhereから多くのことを試してみました。また、this oneは、それだけで静的ファイルを提供しているため動作しません。 putChildを指定しているかどうかに関係なく、常にgetChildに行きます。

+0

問題を再現できません。私は無関係なものを削除しましたが、コアはそのまま残しました。そして、私のディレクトリリストを提供しています。 –

+0

Twisted、Python、どのようなOSなどのバージョン。 –

+0

Python 3.5、Windows 10.いいえvenv。 – Luke

答えて

4

"rcs"のような裸の文字列はユニコード文字列です(Python 3は "str"と呼ばれますが、あいまいさを避けるために "unicode"と呼んでいます)。

ただし、twisted.web.resource.Resource.putChildには、最初の引数としてバイト文字列が必要です。代わりにunicodeが与えられたとき、むしろうまく動かない。パスセグメントをバイト文字列にしてください(例:b"rcs")、サーバーはPython 3でよりよく動作します。

関連する問題