何が、なぜ、アプリケーション固有のものなどについての詳細で私を退屈させてくれることを絶対に望んでいます
ホー。さてあなたはそれを求めました!
ダニエルのように、私は個人的にmod_wsgiでApacheを使用しています。まだ十分に新しいので、一部の環境でのデプロイは苦労する可能性がありますが、とにかくすべてを自分でコンパイルする場合は、非常に簡単です。初期のバージョンでさえ、非常に信頼できることがわかりました。グラハム・ダンプルトンを自分でコントロールし続けるための小道具。
ただし、私にとっては、WSGIアプリケーションがすべての可能なサーバーで機能することが不可欠です。現在、この領域には少し穴があります。WSGI呼び出し可能オブジェクト(アプリケーション)が何をするかを示すWSGI標準がありますが、デプロイメントの標準化はありません。アプリケーションの場所をWebサーバーに伝える単一の方法はありません。また、更新時にサーバーにアプリケーションを再ロードさせる標準化された方法もありません。
私が採用したアプローチは次のとおりです。
モジュール/パッケージ内のすべてのアプリケーションロジック、できればクラス内
メインアプリケーションをサブクラス化し、メンバーをオーバーライドすることによって行われるすべてのWebサイト固有のカスタマイズ
クラス__init__()パラメーターとしてのすべてのサーバー固有のデプロイメント設定(データベース接続ファクトリー、メールリレー設定など)
現在のサーバーの正しいデプロイメント設定でApplicationクラスを初期化し、CGIスクリプト、mod_wsgi WSGIScriptAlias(またはPassenger、これは明らかに同じように機能します)、またはコマンドラインから対話できます
上記のデプロイメントの問題を処理し、アプリケーションが変更に依存しているモジュールのときにアプリケーションをリロードできるようにするヘルパーモジュール
したがって、application.pyが最終的にどのように見えるかは次のようになります。
#!/usr/bin/env python
import os.path
basedir= os.path.dirname(__file__)
import MySQLdb
def dbfactory():
return MySQLdb.connect(db= 'myappdb', unix_socket= '/var/mysql/socket', user= 'u', passwd= 'p')
def appfactory():
import myapplication
return myapplication.Application(basedir, dbfactory, debug= False)
import wsgiwrap
ismain= __name__=='__main__'
libdir= os.path.join(basedir, 'system', 'lib')
application= wsgiwrap.Wrapper(appfactory, libdir, 10, ismain)
wsgiwrap.Wrapperは、libdir内のアプリケーションモジュールのいずれかが更新されているかどうかを10秒ごとにチェックし、更新されている場合は、すべてを確実にアンロードするための厄介なsys.modulesマジックを実行します。次に、appfactory()が再度呼び出され、更新されたアプリケーションの新しいインスタンスが取得されます。
(次のようなコマンドラインツールを使用することもできます
./application.py setup
./application.py daemon
呼び出し可能なアプリケーションによって提供されるセットアップフックとバックグラウンドタスクフックを実行します—distutilsの動作に少し似ています。また、initスクリプトのように開始/停止/再起動に応答します。)
私が使用するもう1つのトリックは、複数のサーバー(開発/テスト/本番)のデプロイメント設定を同じapplication.pyスクリプトに入れ、「socket.gethostname()」をスニッフィングして、使用するサーバー固有の設定を決定することです。
ある時点で、wsgiwrapをパッケージ化して、適切にリリースする可能性があります(おそらく別の名前で)。それまでの間、興味がある場合は、 http://www.doxdesk.com/file/software/py/v/wsgiwrap-0.5.pyでdogfood-developmentバージョンを確認できます。