2016-06-02 4 views
0

Я пытаюсь написать сценарий, в котором кто-то может ввести имя веб-сайта в поле, и мой скрипт предоставит ресурсы этого веб-сайта. Я не уверен, как идти об этом, я думаю, это было бы что-то вроде этого:Как обращаться с запросами POST в 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() 

Этот сценарий просто не работает, когда сценарий я получаю сообщение об ошибке: Request did not return bytes. Может ли кто-нибудь сказать мне, что я делаю неправильно, или где я могу больше узнать об этой теме? благодаря!!

+0

Пожалуйста, не задавайте два вопроса по одному и тому же вопросу. [Как обрабатывать запросы POST в Twisted] (https://stackoverflow.com/questions/37398611/how-to-handle-post-requests-in-twisted) –

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^