2009-08-14 9 views
7

Jest to bardzo podobne pytanie do tego wątku na SO middleware and views communicatingmiddleware porównaniu z procesorem kontekstowego dla widoku zależnego nawigacja/wyświetlacza

Chcielibyśmy mieć nasze szablony mieć standardowy zestaw zmiennych kontekstowych. Tak więc procesor kontekstowy wydaje się odpowiedni, jednak nie wydaje się, aby procesor kontekstowy był świadomy widoku. Wcześniej byliśmy zmuszeni do sprawdzenia stosu wywołań, aby uzyskać kontekstowe informacje o tym, co robi widok.

To tam widzieliśmy wątek oprogramowania pośredniego oraz podpis process_view() dla oprogramowania pośredniego, które zapewnia uchwyt do widoku.

To wydawało się bliższe naszym potrzebom, ale nie pozwalało nam modyfikować zmiennej kontekstowej, podobnie jak inne metody oprogramowania pośredniego.

Tak więc naszym głównym pomysłem, o którym mówiliśmy, było zmodyfikowanie obiektu żądania za pomocą wszystkich informacji globalnych i kontekstowych, jakich potrzebowaliśmy w naszych szablonach, i zmuszenia szablonów do wywoływania z poziomu {{request.something}} w celu uzyskania konkretnych informacji, których potrzebujemy, takich jak {{request.viewname}}.

Więc nasze pytania:

  • modyfikuje/ustawienia wartości na życzenie object akceptowaną rzeczą do zrobienia za popychanie kontekstowe/globalne konkretne informacje aplikację do szablonów? Czy standardową praktyką jest zawsze umieszczanie go w kontekstach?
  • Czy istnieją sposoby na podchodzenie do procesorów kontekstowych, które nie wymagają jawnego przekazywania lub wykonywania introspekcji stosu?
  • Czy middleware.process_response ma możliwość modyfikacji kontekstu lub czy jest niezmienny?

Odpowiedz

4

Jest to całkowicie poprawne ustawienie zmiennych na żądanie w oprogramowaniu middleware - robię to cały czas.

Nie ma sposobu, aby użyć do tego celu process_response, ponieważ do tego czasu szablon został już wyrenderowany - w tym momencie wszystko, co dostajesz, to HttpResponse zawierający wiązkę HTML.

Alternatywą może być owinięcie render_to_response za pomocą własnej funkcji, która pobiera kontekst wraz z żądaniem i szablonem i modyfikuje go w razie potrzeby przed przekazaniem do rzeczywistej funkcji renderowania. Ma to tę zaletę, że modyfikuje rzeczywisty kontekst, ale ma tę wadę, że należy pamiętać, aby wywoływać go w każdym widoku zamiast domyślnej funkcji.

+0

Patrz także http://jboxer.com/2009/05/django-middleware-vs-context-processors/ – Ztyx

2

Można to zrobić, używając oprogramowania pośredniego i procesora kontekstowego w tandemie. Oprogramowanie pośrednie wie o widoku i może ustawić atrybut na żądanie. Następnie procesor kontekstu może przenieść wszystko ustawione na żądanie do kontekstu.

Na przykład:

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 

Następnie procesor kontekst:

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