用 Apache 替换 Flask 内部 Web 服务器
Replacing flask internal web server with Apache
我已经编写了一个当前与 Flask 内部 Web 服务器一起工作的单用户应用程序。它似乎不是很健壮,并且一旦页面需要很长时间加载并且用户在等待时导航到其他地方,它就会因各种套接字错误而崩溃。所以我想用Apache代替它。
问题是,我当前的代码是一个程序,它首先启动大约十个线程来做一些事情,例如设置到远程服务器的 ssh 隧道和 zmq 连接以与位于那里的数据库进行通信。最后进入运行()循环启动内部服务器。
我按照各种说明进行操作,并设法获得了 Apache 服务的初始页面。然而,一切都出错了,因为我现在没有任何可用的工作线程,也没有任何全局初始化的 classes,并且 none 我的全局变量持有与这些线程通信的接口不存在。
显然我不是网络开发人员。
我当前的代码 "wrong" 有多糟糕?有什么方法可以通过合理的工作量使它与 Apache 一起工作吗?我可以让 Apache 只替换 运行() 部分并拥有一个 运行ning 应用程序,Apache 与之通信吗?我当前的应用程序非常简化(没有数据处理线程)是这样的:
comm=None
app = Flask(__name__)
class CommsHandler(object):
__init__(self):
*Init communication links to external servers and databases*
def request_data(self, request):
*Use initialised links to request something*
return result
@app.route("/", methods=["GET"]):
def mainpage():
return render_template("main.html")
@app.route("/foo", methods=["GET"]):
def foo():
a=comm.request_data("xyzzy")
return render_template("foo.html", data=a)
comm = CommsHandler()
app.run()
还是我做错了?现在,当我删除 app.run 并将应用程序 class 导入 wsgi 脚本时,我确实从主页得到了响应,因为它不需要引用全局变量 comm。
/foo 不起作用,因为 "comm" 是一个未初始化的变量。我当然明白为什么。我只是从没想过这需要导出到 Apache 或任何其他 Web 服务器。
所以问题是,我能否在引导时以某种方式在 rc 脚本中启动此应用程序,设置其通信链接和所有内容,然后让 Apache/wsgi 仅调用 运行ning 应用程序的函数而不是推出一个新的?
汉奴
这是在内部服务器上使用 flask 运行 的简单应用程序:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
在 apache 服务器上 运行 查看 fastCGI 文档 :
from flup.server.fcgi import WSGIServer
from yourapplication import app
if __name__ == '__main__':
WSGIServer(app).run()
我已经编写了一个当前与 Flask 内部 Web 服务器一起工作的单用户应用程序。它似乎不是很健壮,并且一旦页面需要很长时间加载并且用户在等待时导航到其他地方,它就会因各种套接字错误而崩溃。所以我想用Apache代替它。
问题是,我当前的代码是一个程序,它首先启动大约十个线程来做一些事情,例如设置到远程服务器的 ssh 隧道和 zmq 连接以与位于那里的数据库进行通信。最后进入运行()循环启动内部服务器。
我按照各种说明进行操作,并设法获得了 Apache 服务的初始页面。然而,一切都出错了,因为我现在没有任何可用的工作线程,也没有任何全局初始化的 classes,并且 none 我的全局变量持有与这些线程通信的接口不存在。
显然我不是网络开发人员。
我当前的代码 "wrong" 有多糟糕?有什么方法可以通过合理的工作量使它与 Apache 一起工作吗?我可以让 Apache 只替换 运行() 部分并拥有一个 运行ning 应用程序,Apache 与之通信吗?我当前的应用程序非常简化(没有数据处理线程)是这样的:
comm=None
app = Flask(__name__)
class CommsHandler(object):
__init__(self):
*Init communication links to external servers and databases*
def request_data(self, request):
*Use initialised links to request something*
return result
@app.route("/", methods=["GET"]):
def mainpage():
return render_template("main.html")
@app.route("/foo", methods=["GET"]):
def foo():
a=comm.request_data("xyzzy")
return render_template("foo.html", data=a)
comm = CommsHandler()
app.run()
还是我做错了?现在,当我删除 app.run 并将应用程序 class 导入 wsgi 脚本时,我确实从主页得到了响应,因为它不需要引用全局变量 comm。
/foo 不起作用,因为 "comm" 是一个未初始化的变量。我当然明白为什么。我只是从没想过这需要导出到 Apache 或任何其他 Web 服务器。
所以问题是,我能否在引导时以某种方式在 rc 脚本中启动此应用程序,设置其通信链接和所有内容,然后让 Apache/wsgi 仅调用 运行ning 应用程序的函数而不是推出一个新的?
汉奴
这是在内部服务器上使用 flask 运行 的简单应用程序:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
在 apache 服务器上 运行 查看 fastCGI 文档 :
from flup.server.fcgi import WSGIServer
from yourapplication import app
if __name__ == '__main__':
WSGIServer(app).run()