7

テンプレートレイヤーでアクセスできるミドルウェアクラスの1つに変数を設定するのに問題があるようです。

基本的なレイアウトは次のとおりです。

class TheMiddleware(object):
    def __init__(self, etc):
        stuff...

    def process_response(self, request, response):
        request.my_var = "whatever"
        return response

次に、別のビューのテンプレートで、次のようにします。

{% custom_tag arg_a %}

これは、リクエストから変数を返す必要があるテンプレートタグです。

@register.simple_tag
def custom_tag(arg_a):
    return threading.currentThread().request.my_var

これは、「レンダリング中にAttributeErrorをキャッチしました:'WSGIRequest'オブジェクトに属性'my_var'がありません」でエラーになります。

テンプレートタグのリクエストにアクセスする方法かもしれないと思いました。そこで、この質問のようにdjango.core.context_processors.requestをTEMPLATE_CONTEXT_PROCESSORSに追加し、リクエストオブジェクトをタグに渡して、テンプレートから直接リクエストにアクセスしようとしましたが、運がありませんでした。

リクエストオブジェクトがどのように機能するかについての理解が不足していると思います。変数をリクエストオブジェクトに割り当て、その変数をいくつかのビューで取得することは可能ですか?リクエストオブジェクトがビューを通過したと思いましたが、代わりに新しいインスタンスが生成されたようです。

その場合、ビューまたはテンプレートのいずれの場合でも、アプリの任意のポイントからアクセスできるミドルウェア内にグローバル変数を格納するにはどうすればよいでしょうか。

更新

混乱を解消するために(私のものか他の人かはわかりません!)、ビューのprocess_responseミドルウェアでリクエスト変数を設定してから、同じビューのテンプレートでそれを取得しようとはしていません。変数が保存される前にテンプレートが処理されているため、これは機能しないことを理解しています。(これは私の側の意図的な行為です)。

view1view2の2つのビューがあります。1つには、ミドルウェアにリクエストの変数を設定させるデコレータがあります。変数にアクセスしたいのは、変数が設定された後に来るview2テンプレートです。

4

2 に答える 2

10

ミドルウェアでの応答の処理中に変数を設定しようとしています。

process_request()代わりに変数を設定するために実装する必要があると思います。

def process_request(self, request):
    request.my_var = "whatever"
    return 
于 2013-03-26T10:03:14.950 に答える
3

リクエストに応じて設定している場合、ここでthreadlocalsを使用しようとする理由はまったくわかりません。説明するように、コンテキストプロセッサを使用する必要があります。

ただし、問題の理由はprocess_response、要求/応答サイクルの応答フェーズで実行されるためです。つまり、ビューが呼び出された後です。process_request代わりに定義する必要があります。ミドルウェアメソッドが呼び出される順序の説明については、ここを参照してください。

于 2013-03-26T10:03:05.257 に答える