2013-03-26 11 views
5

Mam problemy z ustawieniem zmiennej w jednej z moich klas oprogramowania pośredniego, do której następnie dostęp będę mógł uzyskać w warstwie szablonów.Ustawianie zmiennej w oprogramowaniu pośrednim dostępnej w szablonie

Podstawowy układ jest taki:

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

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

Następnie na matrycę do innego widoku mam:

{% custom_tag arg_a %} 

Który jest szablon, który powinien zwrócić zmienną z wniosku:

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

to uwagę błędy z „Caught AttributeError whil e rendering: obiekt "WSGIRequest" nie ma atrybutu "my_var" "

Myślałem, że może to być sposób, w jaki uzyskiwałem dostęp do żądania w tagu szablonu. Dlatego dodałem django.core.context_processors.request do mojego TEMPLATE_CONTEXT_PROCESSORS, jak w This question i próbowałem przekazać obiekt żądania do tagu, a następnie uzyskać dostęp do żądania bezpośrednio z szablonu, ale bez powodzenia.

Myślę, że brakuje mi zrozumienia, jak działają obiekty żądania. Czy można przypisać zmienną do obiektu żądania i wybrać tę zmienną w kilku widokach? Myślałem, że obiekt żądania został przekazany przez widoki, ale wydaje się, że zamiast tego generowana jest nowa instancja.

Jeśli tak, to w jaki sposób przechowuje się przechowywanie zmiennej globalnej w oprogramowaniu pośredniczącym, które można następnie uzyskać dostęp z dowolnego punktu w aplikacji, czy to w widoku lub szablonu?

Aktualizacja:

wyjaśnić zamieszanie (czy kopalnia lub inni nie jestem pewien!) Jestem nie próbuje ustawić zmienną żądania w middleware process_response z widoku, a następnie podnieś go w szablonie tego samego widoku. Rozumiem, że to nie zadziała, ponieważ szablon został przetworzony przed zapisaniem zmiennej. (Jest to celowe działanie z mojej strony).

Mam dwa widoki, View1 i view2 widok trzeba dekorator, który powoduje middleware ustawić zmienną we wniosku. Jest to szablon view2, który pojawia się po ustawieniu zmiennej, że chcę uzyskać dostęp do zmiennej.

Odpowiedz

7

Próbujesz ustawić zmienną podczas przetwarzania odpowiedzi w oprogramowaniu pośredniczącym.

Myślę, że powinieneś implementować process_request() zamiast tego, aby ustawić zmienną.

def process_request(self, request): 
    request.my_var = "whatever" 
    return 
+0

aktualizowane na pytanie, mój wybór process_response było celowe – PT114

+0

@ PT114, to znaczy, że są 2 oddzielne wnioski napływające na 2 różnych adresów URL/poglądów? – Rohan

+0

Tak. Sądziłem, że żądanie to trwało przez cały czas wraz z dowolnymi zmiennymi, ale wygląda na to, że tak nie jest. W takim razie, jak byś postąpiła przy przechowywaniu zmiennej, która mogłaby być dostępna globalnie? – PT114

2

Jeśli ustawiasz go na żądanie, nie widzę żadnego powodu, aby spróbować użyć tutaj wątków. Powinieneś używać procesora kontekstu podczas opisywania.

Powód tego problemu polega na tym, że process_response jest uruchamiany w fazie odpowiedzi w cyklu żądanie/odpowiedź: tj. po Twój widok został wywołany. Zamiast tego należy zdefiniować process_request. Zobacz here, aby uzyskać opis kolejności wywoływania metod oprogramowania pośredniego.

Powiązane problemy