2011-09-01 9 views
7

自分のコードを有効にするための信号を送信するプラグインを作成しました。しかし、それは私のコードにユーザー要求オブジェクトを送信しません。私は、メインアプリケーションを変更せずに現在の要求を取得する方法を探しています。グローバルリクエストに関連するドキュメント(PHPで$_SERVER['REMOTE_ADDR']など)が見つかりません。Python/Djangoのグローバルリクエスト変数は利用できますか?

私は、Python/Djangoでそれを行う変数があるかどうかを知りたいと思います。

def detail(request, some_param): 
    # [...] 

パラメータrequestはHTTPリクエストに関する情報が含まれています。私はそれを知っているよう

答えて

0

は、次のような、多くの方法を使用して、Djangoのビューを定義します。たとえば、request.META['HTTP_X_FORWARDED_FOR']は、クライアントのIPアドレスを返します。

あなたのプラグインがリクエストと関係がある場合、そのクラスと関数はおそらくあなたのビューからインスタンス化/呼び出されます。つまり、現在のrequestオブジェクトに渡す必要があります。グローバルリクエストオブジェクトを持ち込むことは意味がありません。 PHPでは、すべてのリクエストがゼロから実行されるため、Djangoリクエストはサーバによって送出され、HttpRequestオブジェクトを使用してフレームワーク内で渡されるため、これは可能です。詳細については、Djangoのマニュアルのthisも参照してください。

+0

それを取得することができ、ビューが存在する、と私は何を持ってしても、そのビューによって活性化させるプラグインが、そのビューの避難所でありますリクエストオブジェクトを自分の関数に送りません。私はまた、メインアプリケーションのコード(ビュー)の動作を変更することはできません。だから、別の解決策を探す必要があります。 – scalopus

+0

これはほとんどできません。最新の記事をご覧ください。 Djangoは一度に複数の要求を処理できるため、グローバルではあるが要求固有の状態は存在できません。プラグインが何をしているのか、プラグインがどのように構造化されているのか、あるいはいくつかのコードを投稿していることについて、より多くの情報を提供すれば、解決策を見つけ出すことができるかもしれません。 –

13

Djangoはグローバルリクエストオブジェクトを提供しません(グローバルではなく、実際にはスレッドローカルになります)。しかし、あなた自身が同じ効果を得るために使用できるいくつかのテクニックがあります:http://nedbatchelder.com/blog/201008/global_django_requests.html

+0

これは実際には最も正確な答えです。ビューの外にリクエストに到達する方法。ソリューションはちょっとハックしています(ミドルウェアをインストールして、辞書内のすべてのスレッドのリクエストオブジェクトを捕捉します)。これは、グローバルに取得するのではなく、要求をダウンさせることを奨励しています。 'ModelAdmin.save_model(...)'が先にオーバーライドされているようです(さらに悪いことに 'ModelAdmin.save_related(...)')。 –

0

AFAIK利用可能にすることを除いて、それは利用できません。

あなたはペースト+他の回答で提供スニペットをコピーすることもできますし、このライブラリを使用することができます:現在のリクエストが常に利用できるようにするhttps://pypi.python.org/pypi/django-crequest

ミドルウェア。

関連する問題