2012-03-13 1 views
14

私は自分のApacheサーバーのセットアップを持っており、mod_wsgiを介してFlaskの応答を処理しています。Apacheとmod_wsgiでFlaskルートを使用するにはどうすればよいですか?

[/ MNT/WWW /:私は上記のパスに対応するWSGIファイルを追加した

【のhttpd.conf]

WSGIScriptAlias /service "/mnt/www/wsgi-scripts/service.wsgi" 

:私は、エイリアスを介しWSGIスクリプトを登録しましたWSGI-スクリプト/ service.wsgi]

import sys 
sys.path.insert(0, "/mnt/www/wsgi-scripts") 

from service import application 

そして私は、サービスモジュールを提供して簡単なテストフラスコPythonスクリプトがあります。

を0

[/mnt/www/wsgi-scripts/service.py]

from flask import Flask 

app = Flask(__name__) 

@app.route('/') 
def application(environ, start_response): 
     status = '200 OK' 
     output = "Hello World!" 
     response_headers = [('Content-type', 'text/plain'), 
          ('Content-Length', str(len(output)))] 
     start_response(status, response_headers) 
     return [output] 

@app.route('/upload') 
def upload(environ, start_response): 
     output = "Uploading" 
     status = '200 OK' 
     response_headers = [('Content-type', 'text/plain'), 
          ('Content-Length', str(len(output)))] 
     start_response(status, response_headers) 
     return [output] 

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

私は私のウェブサイトのURLを[ホスト名]期待して私が手としてそれが動作/サービスに行くの "Hello World!"バック。問題は、上の例の「アップロード」のように、他のルートをどのように動作させるのか分かりません。これはスタンドアローンのFlaskではうまく動作しますが、mod_wsgiではうまく動作しません。私が想像できる唯一のことは、私が望む各エンドポイントのためのhttpd.confに別々のWSGIスクリプトエイリアスを登録することですが、それはFlaskのファンシールーティングサポートを奪います。この仕事をする方法はありますか?

+3

あなたは '/ service/upload'を参照しようとしましたか?あなたはうれしく驚くかもしれません。 –

+0

私が/ service/uploadを打つと、リクエストはまだ 'application'機能に送られます。実際、アプリケーション機能の前にroute文を削除することはできますが、それでも動作します。アプリケーションのエントリポイントとしてmod_wsgiがアプリケーションを常に使用しているようです。 Flaskのルーティングロジックを起動する「アプリケーション」の中で何かをする必要があるように感じます。 –

答えて

17

from service import applicationのwsgiファイルでは、applicationメソッドのみをインポートしています。

from service import app as applicationに変更してください。すべてが期待通りに機能します。

あなたのコメントの後、私は答えを少し拡大しようと思いました:

あなたのWSGIファイルは、Pythonのコードです - あなたは、このファイル内の任意の有効なPythonコードを持つことができます。 Apacheにインストールされているwsgiの "ハンドラ"は、アプリケーションという名前をこのファイルに探します。このファイルにはリクエストが渡されます。 Flaskクラスのインスタンス-app = Flask(__name__) - はこのようなインターフェイスを提供しますが、appではなくapplicationと呼ばれているので、インポート時にエイリアスする必要があります。

これは完全に問題ありません。このapplication = Flask(__name__)を実行してから、Apacheのwsgiハンドラをservice.pyファイルに設定します。 service.pyがインポート可能な場合(つまり、PYTHONPATHのどこかに)、中間のwsgiスクリプトは必要ありません。

上記の作業は、悪い習慣ですが、 wsgiファイルには、Apacheプロセスからのアクセス許可が必要です。一般的には、適切なパーミッションでファイルシステム上の他の場所にあるべき実際のソースコードとは別のものです。

+0

そのトリックをしました。ありがとうございました!あなたが指定したものと一致するようにservice.wsgiを変更することに加えて、私もservice.pyを純粋なフラスコに戻す必要がありました。元の問題文では、純粋なmod_wsgiコードとFlaskを混ぜ合わせたレールから抜け出したと思います。私は、この混乱の起源は私のルートルートハンドラのアプリケーションに名前を付けることだったと思います。 –

+1

私は、mod_wsgiとFlaskのコードが不明であったと思います。私はそれがすべてPythonだと理解しています。私が固執していたのは、上の例で '@ app.route( '/')'が関数 'application'を装飾しているということです。私のオリジナルの設定では、アプリケーションをインポートしていたので、その関数だけが呼び出されていました。 _service.wsgi_をFlaskオブジェクトを正しく参照した 'from application import app from application'を使用するように変更しましたが、' application'関数とのネーミング競合も発生しているようです。私はこの関数の名前を '@def root():'に変更しました。再度、感謝します! –

+0

甘い!これは私の悲しみに対する答えでした。 –

関連する問題