如何运行用烧瓶拧?
How to run twisted with flask?
我希望能够 运行 在同一端口的不同目录上同时使用多个扭曲的代理服务器,我想我可能会使用 flask。
所以这是我的代码:
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')
但是每当我 运行 这个脚本时,我都会收到一个内部服务器错误,我假设是因为当 app.run
在端口 80 上被调用时, reactor.run
不能也在监听 80 端口。我想知道是否有某种解决方法,或者我做错了什么。非常感谢任何帮助,谢谢!!
您可以使用 Twisted 中的 WSGIResource 而不是 ReverseProxy。
更新: 添加了一个更复杂的示例,在 /my_flask 处设置了一个 WSGIResource,在 /example
处设置了一个 ReverseProxy
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()
在您的本地主机中尝试 运行 以上内容,然后访问 localhost:8081/my_flask/example 或 localhost:8081/example
你应该 klein
试试看。大多数 twisted
核心开发者都在制作和使用它。语法与 flask
非常相似,因此如果您已经有一个可用的 flask
应用程序,则无需重写太多内容。所以类似下面的 应该 工作:
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
链接
已接受的答案未涵盖如何 运行 使用 Flask 进行扭曲,并指向不同的框架。带有示例的答案也不再有效。
这里有两个不同的例子。第一个与第一个答案相同,但已修复 Python 3
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(b'my_flask', flask_site)
site_example = ReverseProxyResource('www.example.com', 80, b'/')
root.putChild(b'example', site_example)
reactor.listenTCP(8081, Site(root))
reactor.run()
对于此示例,运行 它并打开其中任何一个:
localhost:8081/my_flask/example
localhost:8081/示例
推荐使用另一个示例,因为它设置了两个服务并通过 .tac 文件将它们提供给 twistd。
从这里获取基本代码:https://github.com/pika/pika/blob/master/examples/twisted_service.py
"""Modify the bottom of the file to pick the new MultiService"""
# ... all the code from twisted_service.py goes here.
# Scroll to the bottom of the file and
# remove everything below application = service.Application("pikaapplication")
# You should keep the PikaService, PikaProtocol and PikaFactory
# classes, since we need them for this code:
from pika.connection import ConnectionParameters
from pika.credentials import PlainCredentials
from twisted.application import service, strports
from twisted.internet import reactor
from twisted.web.server import Site
from twisted.web.wsgi import WSGIResource
from flask import Flask
# This IServiceCollection will hold Pika and Flask
flask_pika_multiservice = service.MultiService()
# FLASK SERVICE SETUP
app = Flask("demoapp")
@app.route('/')
def hello_world():
return 'Hello, World!'
flask_site = Site(WSGIResource(reactor, reactor.getThreadPool(), app))
# New resources can be added, such as WSGI, or proxies by creating
# a root resource in the place of the flask_site, and adding the
# new resources to the root.
# root = Resource()
# root.putChild(b'my_flask_site', flask_site)
# from twisted.web.proxy import ReverseProxyResource
# site_example = ReverseProxyResource('www.example.com', 80, b'/')
# root.putChild(b'example', site_example)
i = strports.service(f"tcp:8088", flask_site)
i.setServiceParent(flask_pika_multiservice)
# PIKA SERVICE SETUP
ps = PikaService(
ConnectionParameters(
host="localhost",
virtual_host="/",
credentials=PlainCredentials("guest", "guest")))
ps.setServiceParent(flask_pika_multiservice)
# Application setup
application = service.Application('flask_pika')
flask_pika_multiservice.setServiceParent(application)
现在您可以运行它:
PYTHONPATH=. twistd -ny twisted_service.py
如果您不想从同一路径导入任何内容,则可以跳过 python 路径。 twisted 需要实际安装项目,并且不支持 运行 直接从源文件夹安装它们,除非您使用该解决方法。
第二个示例在不同的端口上建立了两个服务。它适用于 pika 和 flask 运行 同时在同一个 twisted 服务器上。最好的部分是它展示了如何将 flask 设置为服务,它可以是 IServiceCollection
的一部分
我希望能够 运行 在同一端口的不同目录上同时使用多个扭曲的代理服务器,我想我可能会使用 flask。 所以这是我的代码:
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')
但是每当我 运行 这个脚本时,我都会收到一个内部服务器错误,我假设是因为当 app.run
在端口 80 上被调用时, reactor.run
不能也在监听 80 端口。我想知道是否有某种解决方法,或者我做错了什么。非常感谢任何帮助,谢谢!!
您可以使用 Twisted 中的 WSGIResource 而不是 ReverseProxy。
更新: 添加了一个更复杂的示例,在 /my_flask 处设置了一个 WSGIResource,在 /example
处设置了一个 ReverseProxyfrom 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()
在您的本地主机中尝试 运行 以上内容,然后访问 localhost:8081/my_flask/example 或 localhost:8081/example
你应该 klein
试试看。大多数 twisted
核心开发者都在制作和使用它。语法与 flask
非常相似,因此如果您已经有一个可用的 flask
应用程序,则无需重写太多内容。所以类似下面的 应该 工作:
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
链接
已接受的答案未涵盖如何 运行 使用 Flask 进行扭曲,并指向不同的框架。带有示例的答案也不再有效。
这里有两个不同的例子。第一个与第一个答案相同,但已修复 Python 3
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(b'my_flask', flask_site)
site_example = ReverseProxyResource('www.example.com', 80, b'/')
root.putChild(b'example', site_example)
reactor.listenTCP(8081, Site(root))
reactor.run()
对于此示例,运行 它并打开其中任何一个:
localhost:8081/my_flask/example
localhost:8081/示例
推荐使用另一个示例,因为它设置了两个服务并通过 .tac 文件将它们提供给 twistd。 从这里获取基本代码:https://github.com/pika/pika/blob/master/examples/twisted_service.py
"""Modify the bottom of the file to pick the new MultiService"""
# ... all the code from twisted_service.py goes here.
# Scroll to the bottom of the file and
# remove everything below application = service.Application("pikaapplication")
# You should keep the PikaService, PikaProtocol and PikaFactory
# classes, since we need them for this code:
from pika.connection import ConnectionParameters
from pika.credentials import PlainCredentials
from twisted.application import service, strports
from twisted.internet import reactor
from twisted.web.server import Site
from twisted.web.wsgi import WSGIResource
from flask import Flask
# This IServiceCollection will hold Pika and Flask
flask_pika_multiservice = service.MultiService()
# FLASK SERVICE SETUP
app = Flask("demoapp")
@app.route('/')
def hello_world():
return 'Hello, World!'
flask_site = Site(WSGIResource(reactor, reactor.getThreadPool(), app))
# New resources can be added, such as WSGI, or proxies by creating
# a root resource in the place of the flask_site, and adding the
# new resources to the root.
# root = Resource()
# root.putChild(b'my_flask_site', flask_site)
# from twisted.web.proxy import ReverseProxyResource
# site_example = ReverseProxyResource('www.example.com', 80, b'/')
# root.putChild(b'example', site_example)
i = strports.service(f"tcp:8088", flask_site)
i.setServiceParent(flask_pika_multiservice)
# PIKA SERVICE SETUP
ps = PikaService(
ConnectionParameters(
host="localhost",
virtual_host="/",
credentials=PlainCredentials("guest", "guest")))
ps.setServiceParent(flask_pika_multiservice)
# Application setup
application = service.Application('flask_pika')
flask_pika_multiservice.setServiceParent(application)
现在您可以运行它:
PYTHONPATH=. twistd -ny twisted_service.py
如果您不想从同一路径导入任何内容,则可以跳过 python 路径。 twisted 需要实际安装项目,并且不支持 运行 直接从源文件夹安装它们,除非您使用该解决方法。
第二个示例在不同的端口上建立了两个服务。它适用于 pika 和 flask 运行 同时在同一个 twisted 服务器上。最好的部分是它展示了如何将 flask 设置为服务,它可以是 IServiceCollection
的一部分