2

私は web.py ( mongsの書き換え/拡張) で web-app を作成しています。これは、スタンドアロンアプリケーションとしても、リクエストを転送できるサブアプリとしても機能させたいと考えています。私が抱えている問題は、サブアプリとして使用すると、静的ファイルを独自の静的ディレクトリから簡単に提供できないことです。これを配布するつもりなので (ユーザーがファイルをプロジェクトの静的ディレクトリに結合する必要はありません)、ディレクトリ構造を次のようにします。

app_that_is_using_mongs (not mine)
    static (which holds the app's static files - also not mine)
    mongs (my subapp)
        main.py (the code for mongs)
        view (holds templates)
        static (the static folder for mongs)
    main.py (the code for the app that is using mongs)

...mongsディレクトリ全体が、それを使用しているアプリから分離されるようにします。

これを機能させるためのいくつかの可能性を検討しました。

  • 次のように、静的ディレクトリからファイルを読み取って出力する要求ハンドラーを使用します。

    cwd = os.path.dirname(__file__) + '/'  # get current working directory
    
    class Static:
        def GET(self, filename):
            """searches for and returns a requested static file or 404s out"""
            try:
                return open(cwd + 'static/' + filename, 'r').read()
            except:
                web.application.notfound(app)  # file not found
    

大きなファイルに対するこのソリューションのパフォーマンスについてはよくわかりませんが、これは web.py が独自に実行できるものであるように思われます。

  • web.pyを介してcherry.py staticdirツールにアクセスして、別の静的ディレクトリを追加します...このようなことを行う方法がわかりません(web.pyが実行されているサーバーと直接やり取りする)、私は知りませんGunicornサーバー(またはcherry.py以外のサーバー)に切り替えても、まだ機能すると思います。

  • web.py が静的ファイルを処理する方法を修正して、拡張性を高めます...他に方法がない場合は、web.py のこの部分を書き換えて、メイン リポジトリにプッシュすることがおそらく最善の方法です。

それで、これを行う最善の方法は何ですか?

4

1 に答える 1

2

web.py では、静的アセットはアプリケーション ルーター経由で提供されません。代わりに、http サーバーにはチェックウェザーがあり、リクエスト URL は で始まり/staticます。これは、サブアプリケーションがあるかどうかに関係なく、ルート アプリケーション/static/...のディレクトリに直接マップされることを意味します。static

静的クラスを構築するという最初のアイデアは間違いなく機能しますが、パフォーマンスに明確な影響があることは間違いありません。ただし、それがどれほど悪いかを実際に知るには、ベンチマークを実行する必要があります。

操作的には悪いが一時的な修正である別のオプションは、親アプリの静的ディレクトリからサブアプリケーションの静的ディレクトリへのソフトリンクを作成することです。すなわち

parent_app/
    static/
        sub_app/ -> parent_app/sub_app/static/sub_app
        ...
    sub_app/
        static/
            sub_app/
                ...

次に、 から静的アセットにアクセスするsub_app場合は、次のような URLにアクセスします/static/sub_app/asset。この URL は で始まるため/static、http サーバーによってキャッチされ、ソフト リンクをたどってディレクトリにリダイレクトされstatic、実際のアセットに解決されます。ディレクトリがあるためsub_app、このソリューションは sub_app を直接実行する場合、または parent_app を実行する場合に機能します。展開するすべてのサーバーとすべての開発環境でこのソフトリンクをセットアップする必要があるため、これは理想的ではありません.

于 2012-11-10T03:12:51.253 に答える