2016-10-03 10 views
0

Flaskの内部Webサーバーで現在動作する単一のユーザーアプリケーションを作成しました。非常に堅牢ではないようで、ページが読み込まれるのに時間がかかり、ユーザーが待機している間に他の場所を移動するとすぐに、あらゆる種類のソケットエラーでクラッシュします。だから私はそれをApacheに置き換えることを考えました。フラスコの内部WebサーバーをApacheに置き換えます。

問題は、私の現在のコードは、例えば、リモートサーバとzmq接続にsshトンネルを設定してそこにあるデータベースと通信するなど、10スレッド程度のスレッドを最初に起動する単一のプログラムです。最後に、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を削除してwsgiスクリプトにappクラスをインポートするだけで、グローバル変数commへの参照が不要なので、メインページからの応答が得られます。 "comm"は初期化されていない変数なので、

/fooは機能しません。そして、私はもちろん、なぜ、見ることができます。私はこれをApacheや他のWebサーバーにエクスポートする必要はないと思っただけです。

これはどういうわけか、起動時のrcスクリプトでこのアプリケーションを起動し、通信リンクとアーチングを設定し、Apache/wsgiに新しいアプリケーションを起動する代わりに実行中のアプリケーションの機能を呼び出させることはできますか?

ハンヌ

答えて

0

これは内部サーバー上のフラスコの実行とシンプルなアプリです:

from flask import Flask 
app = Flask(__name__) 

@app.route("/") 
def hello(): 
    return "Hello World!" 

if __name__ == "__main__": 
    app.run() 

fastCGIドキュメントをチェックアウトApacheサーバ上でそれを実行するには:

from flup.server.fcgi import WSGIServer 
from yourapplication import app 

if __name__ == '__main__': 
    WSGIServer(app).run() 
関連する問題