用Apache

时间:2016-10-03 16:15:59

标签: python apache flask wsgi

我编写了一个目前可与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只调用正在运行的应用程序的功能而不是启动新应用程序吗?

哈努哈利

1 个答案:

答案 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()