我编写了一个目前可与Flask内部Web服务器配合使用的用户应用程序。它似乎并不是非常强大,只要页面需要很长时间加载并且用户在等待时导航到其他地方,它就会崩溃并出现各种套接字错误。所以我想用Apache替换它。
问题是,我当前的代码是一个程序,首先启动大约十个线程来完成工作,例如设置ssh隧道到远程服务器和zmq连接与位于那里的数据库进行通信。最后,它进入run()循环以启动内部服务器。
我遵循各种指令并设法将Apache服务作为初始页面。但是,一切都出错了,因为我现在没有任何工作线程可用,也没有任何全局初始化的类,并且没有任何保持接口与这些线程通信的全局变量不存在。
显然我不是网络开发人员。
我当前的代码有多么“错误”?有没有办法让Apache在合理的工作量下工作?我可以让Apache只替换run()部分并拥有一个正在运行的应用程序,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并将app类导入到wsgi脚本时,我确实从主页面获得了响应,因为它不需要引用全局变量comm。
/ foo不起作用,因为“comm”是未初始化的变量。当然,我可以理解为什么。我从未想过这需要导出到Apache或任何其他Web服务器。
所以问题是,我可以在启动时以某种方式在rc脚本中启动此应用程序,设置其通信链接和每次操作,并让Apache / wsgi只调用正在运行的应用程序的功能而不是启动新应用程序吗?
哈努哈利
答案 0 :(得分:0)
这是在内部服务器上运行烧瓶的简单应用程序:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
要在apache服务器上运行,请查看fastCGI doc:
from flup.server.fcgi import WSGIServer
from yourapplication import app
if __name__ == '__main__':
WSGIServer(app).run()