2009-08-14 5 views
7

これはSO私たちは、テンプレートがコンテキスト変数の標準セットを与えられるしたいのですがmiddleware and views communicatingミドルウェア

にスレッドこれと非常に似て質問です。したがって、コンテキストプロセッサは適切だと思われますが、コンテキストプロセッサがビューを認識しているようには見えません。私たちは以前、呼び出しスタックを検査して、どのビューが何をしているかに関するコンテキスト情報を取得することを余儀なくされました。

私たちは私たちのビューへのハンドルを与えるミドルウェアのミドルウェアスレッドだけでなく、process_view()署名を見たところです。

これは我々のニーズに近い見えたが、私たちはコンテキスト変数を変更することはできませんでした、どちらも他のミドルウェアの方法をしました。

私たちの初心者は、テンプレートに必要なすべてのグローバル情報とコンテキスト情報でリクエストオブジェクトを変更し、テンプレートに{{request.something}}から必要な特定の情報(例:{{request.viewname}})を呼び出すように強制しました。

だから、私たちの質問:

  • は、テンプレートにコンテキスト/グローバルアプリ固有の情報をプッシュするために行うには受け入れられ事リクエストオブジェクトに値を設定/変更していますか?あるいは、標準的なプラクティスは常にそれを文脈に入れることですか?
  • 明示的に渡すか、何らかのスタックイントロスペクションを実行することをコンテキストプロセッサが意識しないようにする方法はありますか?
  • middleware.process_responseにはコンテキストを変更する機会がありますか、それとも不変ですか?

答えて

4

それはミドルウェアでのリクエストに応じて変数を設定するために完全に有効だ - 私はそれをすべての時間を行います。

これにはprocess_responseを使用する方法はありません。テンプレートはすでにレンダリングされています。この時点では、HTMLの束を含むHttpResponseです。

render_to_responseを独自の関数でラップすることもできます。この関数は、要求とテンプレートとともにコンテキストを取得し、実際のレンダリング関数に渡す前に必要に応じて変更します。これには、実際のコンテキストを変更する利点がありますが、デフォルトの機能ではなく、すべてのビューで実際に呼び出す必要があるという欠点があります。

+0

も参照http://jboxer.com/2009/05/django-middleware-vs-context-processors/ – Ztyx

2

ミドルウェアとコンテキストプロセッサを併用することで実現できます。ミドルウェアはビューについて知っており、リクエストにアトリビュートを設定できます。次に、コンテキストプロセッサは、要求に設定されているすべてのものをコンテキストに移動できます。例えば

class ExtraContextMiddleware(object): 
    """ 
    Adds extra context to the response for certain views. 

    Works in tandem with the extra_context context processor. 
    """ 

    context_map = { 
     #Adds the supplied context dict to the named views 
     'my_view_name': {'foo': 'Hello', 'bar': 'Goodbye'}, 
    } 

    def process_view(self, request, view, *args, **kwargs): 
     try: 
      request.extra_context = self.context_map[view.func_name] 
     except KeyError: 
      pass 

、コンテキストプロセッサ:

def extra_context(request): 
    """Context processor for adding extra context. 
    Works in tandem with ExtraContextMiddleware.""" 
    try: 
     return request.extra_context 
    except AttributeError: 
     return {}