Bezstanowość protokołu HTTP jest faktem. Niezależnie od tego, czego chciałby autor danej aplikacji. Na przykład nie jest prawdą, że jeden proces lub wątek serwera jest przypisany jednemu, konkretnemu odwiedzającemu stronę. Wybaczcie zatem łzy, które zakręciły mi się w oczach na widok tego:
def _get_taxprocessor(request=None):
taxprocessor = get_thread_variable('taxer', None)
if not taxprocessor:
if request:
user = request.user
if user.is_authenticated():
user = user
else:
user = None
else:
user = get_current_user()
taxprocessor = get_tax_processor(user=user)
set_thread_variable('taxer', taxprocessor)
return taxprocessor
Dalej był już tylko płacz:
def get_current_user():
user = get_thread_variable('user', None)
if user != None: return user
req = get_current_request()
if req == None: return None
return req.user
I zgrzytanie zębów:
from threading import local
_threadlocals = local()
def set_current_user(user):
set_thread_variable('user', user)
def set_thread_variable(key, var):
setattr(_threadlocals, key, var)
def get_thread_variable(key, default=None):
return getattr(_threadlocals, key, default)
def get_current_request():
return get_thread_variable('request', None)
class ThreadLocalMiddleware(object):
"""Middleware that gets various objects from the
request object and saves them in thread local storage."""
def process_request(self, request):
set_thread_variable('request', request)
set_current_user(request.user)
Pytanie-zagadka: co się stanie z podatkiem, gdy ten sam wątek serwera obsłuży innego użytkownika? Pytanie pomocnicze: skąd może pochodzić ów kod?
Otrzymujesz k3 Punkty Obłędu. Jeśli całkowita liczba zebranych punktów wynosi 6 lub więcej, rozpatrz test nabycia trwałej choroby psychicznej zgodnie z procedurą opisaną w rozdziale Obłęd podręcznika.