2016-06-02 1 views
0

J'essaye d'écrire un script où quelqu'un peut taper le nom d'un site Web dans une boîte et mon script rendra les ressources de ce site Web. Je ne sais pas comment m'y prendre, je pense qu'il aimerait quelque chose comme ceci:Comment gérer les requêtes POST dans Twisted?

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

Ce script ne fonctionne pas juste, lorsque le script je reçois une erreur: Request did not return bytes. Quelqu'un pourrait-il me dire ce que je fais de mal ou où je peux en apprendre davantage sur ce sujet? Merci!!

+0

Veuillez ne pas poser deux fois la même question. [Comment gérer les requêtes POST dans Twisted] (https://stackoverflow.com/questions/37398611/how-to-handle-post-requests-in-twisted) –

Répondre

1

Je n'ai pas travaillé avec les objets Ressources et Site depuis un moment, mais je suis sûr que vous avez surchargé la méthode Resource.getChild() et renvoyez un ReverseProxyResource pour obtenir ce que vous voulez. À mon avis, cela peut être un peu compliqué si vous suivez cette route. Cependant, dans klein ce que vous essayez de faire est trivial et peut facilement être résolu. Vous définissez en principe branch=True et cela permet de renvoyer un objet Resource. Par exemple:

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) 

Maintenant, pour la dernière question, vous êtes en cours d'exécution sur ce 3.x Python et il semble que ReverseProxyResource n'a pas été entièrement porté sur encore. Donc, si vous exécutez ce code dans Python 3, vous obtiendrez des retraçages.

+0

Merci pour votre réponse. Vous êtes génial!!! – Cristian