1

私は Python を初めて使用し (PHP がますます壊れているため、PHP から離れようとしています)、古いコードの移植を急いでいます。ひとこと:

関数 index() および bar() を含むファイル /foo.py があるので、パブリッシャーを使用して、ドキュメントが示唆するようにhttp://domain/foo/barおよびhttp://domain/fooにアクセスできます。

私ができるようにするにはどうすればよいですか:

http://domain/foo/bar/a1/a2/a3/an/ ...

パブリッシャーが bar() を起動すると、URL にアクセスして /a1/a2/ を取得できるようになります。取得できるのは Forbidden だけです :) (すべてに mod_rewrite を使用したくありません)

ああ、私は2.5.2にいます よろしくお願いします

更新: パブリッシャーにとって理想的な解決策は、URL で可能な限り右端の解像度を起動し、apache モジュールを介して a1/a2/a3.. にアクセスできるようにすることです。apache ディレクティブとパブリッシャーの組み合わせでしょうか。

解決済み(っぽい): 魔法のcall ()メソッドなどの答えがジューシー!パブリッシャーを変更するか、独自のものを作成して、最も右のマッチングを使用して同様の方法でオブジェクトを検査し、最も右にある人が apache モジュールを使用して URL にアクセスできるようにします。皆さんありがとう!

4

2 に答える 2

1

モジュール内でオブジェクトをbar.a1.a2.a3.an定義する必要がありfoo.pyます。基本的に、パブリッシャー ハンドラーは URL のスラッシュをドットに置き換え、その名前の Python オブジェクトを見つけようとします。

モジュール内でオブジェクトをbar.a1.a2.a3.an定義する必要がありfoo.pyます。基本的に、パブリッシャー ハンドラーは URL のスラッシュをドットに置き換え、その名前の Python オブジェクトを見つけようとします。

これはあなたが試すことができる奇抜なものですfoo.py:

class _barclass(object):
    def __init__(self, parent, name):
        if parent and name:
            self.path = parent.path + '/' + name
            setattr(parent, name, self)
        else:
            self.path = ''
    def __getattr__(self, name):
        return _barclass(self, name)
    def __call__(self):
        # do your processing here
        # url path is contained in self.path

bar = _barclass(None, None)

これはパブリッシャーが意図することの範囲を狭めるようなものですが、独自のハンドラーをゼロから作成する方がよい場合があります。(または、Django のようなものを使用します。)

于 2009-05-08T18:14:46.483 に答える
1

私の知る限り、これは公開アルゴリズムの能力を超えていると思います。(ドキュメントには確かに言及されていません。 )ただし、発行アルゴリズムを拡張して独自の mod_python ハンドラー ( example here ) を作成することもできます。

mod_wsgiを調べて、代わりに Web アプリケーションをWSGI アプリケーションとしてビルドすることをお勧めします。WSGI ミドルウェアのシェルフとシェルフの恩恵を受けることができますが、特にRoutesなどのルーティング ソフトウェアを使用できます。これは、オブジェクト パブリッシングが十分に強力でない場合を処理するように特別に設計されています。しかし、私はあなたの締め切りを知らないので、これは実現可能かもしれませんし、そうでないかもしれません.

于 2009-05-08T18:17:27.117 に答える