2016-06-02 4 views
0

誰かがウェブサイトの名前をボックスに入力するスクリプトを作成しようとしています。スクリプトはそのウェブサイトのリソースをレンダリングします。私はそれについて移動するかどうかはわかりません、私はそれがこのような何かたいと思っています:スクリプトは、私はエラーを取得するときだけ、動作していないTwistedでPOSTリクエストを処理するにはどうすればよいですか?

class FormPage(Resource): 
    isLeaf = True 
    def render_GET(self, request): 
     return b"""<html><body><form method="POST"><input name="form-field" type="text"/><input type="submit" /></form></body></html>""" 

    def render_POST(self, request): 
     answer = request.content.read()[11:].decode() 
     ReverseProxyResource(answer, 80, b'') 

factory = Site(FormPage()) 
reactor.listenTCP(80, factory) 
reactor.run() 

このスクリプトを:Request did not return bytes。誰かが私が間違っていることや私がこの問題についてもっと知ることができる場所を教えてもらえますか?ありがとう!!

+0

同じ質問を2回聞かないでください。 [TwistedでPOSTリクエストを処理する方法](0120-18753-03) –

答えて

1

私はしばらくの間でリソースとサイトオブジェクトで働いていないが、私はあなたがResource.getChild()メソッドをオーバーロードし、あなたが望むものを達成するためにReverseProxyResourceを返してきたかなり確信しています。あなたがそのルートに行くならば、私の意見ではちょっと混乱するかもしれません。しかし、kleinでは、あなたがしようとしていることは簡単ではなく、簡単に解決できます。基本的にbranch=Trueと設定して、Resourceオブジェクトを返すようにします。たとえば:

from klein import Klein 
from twisted.web.proxy import ReverseProxyResource 

app = Klein() 

@app.route('/', methods=['GET']) 
def render_GET(request): 
    return b"""<html><body><form method="POST"><input name="form-field" type="text"/><input type="submit" /></form></body></html>""" 

@app.route('/', methods=['POST']) 
def render_POST(request, branch=True):  # branch=True lets you return Resources 
    answer = request.args.get(b'form-field', b'localhost').decode('utf-8')  # also use request.args instead 
    return ReverseProxyResource(answer, 80, '') 

app.run('localhost', 80) 

は今、最終的な問題のために、あなたは、Python 3.xの上でこれを実行しているとReverseProxyResourceが完全にまだ終わって移植されていませんように思えます。したがって、Python 3でこのコードを実行すると、トレースバックが発生します。

+0

本当にありがとうございました。あなたは素晴らしいです! – Cristian

関連する問題