2016-04-27 8 views
4

Ich möchte in der Lage sein, mehrere verdrehte Proxy-Server gleichzeitig auf verschiedenen Verzeichnissen am gleichen Port laufen zu lassen, und ich dachte mir, ich könnte flask verwenden. so hier ist mein Code:Wie verdreht man mit Flasche?

from flask import Flask 
from twisted.internet import reactor 
from twisted.web import proxy, server 

app = Flask(__name__) 
@app.route('/example') 
def index(): 
    site = server.Site(proxy.ReverseProxyResource('www.example.com', 80, ''.encode("utf-8"))) 
    reactor.listenTCP(80, site) 
    reactor.run() 

app.run(port=80, host='My_IP') 

Aber immer, wenn ich dieses Skript ausführen, erhalte ich einen Internal Server Error, ich gehe davon aus, denn wenn app.run auf Port 80 aufgerufen wird, kann die reactor.run nicht auf Port 80 hören werden auch. Ich frage mich, ob es irgendeine Art von Arbeit gibt oder was ich falsch mache. Jede Hilfe wird sehr geschätzt, Danke !!

+0

Haben Sie versucht, einen anderen Port verwenden? –

+0

Ja, ich habe versucht, verschiedene Ports zu verwenden. Und es bewirkt, dass die Seite überhaupt nicht auftaucht. – Cristian

Antwort

6

Sie können die WSGIResource aus Twisted anstelle eines ReverseProxy verwenden.

UPDATE: Added ein komplexeres Beispiel, das eine WSGIResource bei/my_flask einrichtet und ein Reverse Proxy bei/example

from flask import Flask 
from twisted.internet import reactor 
from twisted.web.proxy import ReverseProxyResource 
from twisted.web.resource import Resource 
from twisted.web.server import Site 
from twisted.web.wsgi import WSGIResource 

app = Flask(__name__) 


@app.route('/example') 
def index(): 
    return 'My Twisted Flask' 

flask_site = WSGIResource(reactor, reactor.getThreadPool(), app) 

root = Resource() 
root.putChild('my_flask', flask_site) 

site_example = ReverseProxyResource('www.example.com', 80, '/') 
root.putChild('example', site_example) 


reactor.listenTCP(8081, Site(root)) 
reactor.run() 

Versuchen Sie, die oben in Ihrem lokalen Host läuft und dann localhost Besuch: 8081/my_flask/Beispiel oder localhost: 8081/Beispiel

+0

Danke, das funktioniert wirklich gut, die einzige Sache ist, ich bin mir nicht sicher, wo oder wie ich die Proxy-Funktion implementieren würde, um Ressourcen von anderen Servern zu rendern? – Cristian

+0

Aktualisiert meine Antwort – Eduardo

+1

Ich versuche diese Pfade und Ports, mit diesem genauen Code, aber ich bekomme immer 'No Such Resource',' keine solche Child Ressource' – Cristian

6

Sie sollten klein versuchen. Es wird von den meisten Core-Entwicklern twisted gemacht und verwendet. Die Syntax ist sehr ähnlich wie flask, so dass Sie nicht viel neu schreiben müssen, wenn Sie bereits eine funktionierende flask App haben. So etwas wie die folgenden sollte Arbeit:

from twisted.internet import reactor 
from twisted.web import proxy, server 
from klein import Klein 

app = Klein() 

@app.route('/example') 
def home(request): 
    site = server.Site(proxy.ReverseProxyResource('www.example.com', 80, ''.encode("utf-8"))) 
    reactor.listenTCP(80, site) 

app.run('localhost', 8000)  # start the klein app on port 8000 and reactor event loop 

Verbindungen

+0

Ich habe tatsächlich versucht mit Klein, aber ich bekomme immer Fehler, wenn Ich versuche es, gehen Sie zu http://stackoverflow.com/questions/37013869/how-do-irun-klein-with-twisted – Cristian

+0

Die Antwort auf diese Frage ist richtig. Ich habe die Tatsache übersehen, dass Sie versuchen, denselben Port auf der gleichen Schnittstelle zu hören, der Fehler verursacht. Sie könnten theoretisch den auf Port 80 eintreffenden Datenverkehr ausgleichen, aber das könnte übertrieben sein. –