Source

django-class-views-experiments / classmethod.py

Full commit
# Gets the right output. Have to use a classmethod to create the actual view,
# and use configure to set options.

import threading

class View(object):

    @classmethod
    def as_view(cls, request, *args, **kwargs):
        self = cls()
        return self.dispatch(request, *args, **kwargs)

    @classmethod
    def configure(cls, **kwargs):
        class SubClass(cls):
            pass
        for key, val in kwargs.items():
            setattr(SubClass, key, val)
        return SubClass

class MyView(View):

    greeting = "Hello"

    def __init__(self):
        self.foo = []
        self.bar = 0

    def dispatch(self, request, *args, **kwargs):
        self.bar += 1
        self.foo.append('x')
        return "%s; %r; %d" % (self.greeting, self.foo, self.bar)

def mydec(func):
    def _wrapper(*args, **kwargs):
        assert isinstance(args[0], HttpRequest)
        return func(*args, **kwargs)
    return _wrapper

view = mydec(MyView.configure(greeting="Howdy").as_view)

responses = []

class HttpRequest(object):
    pass

def runview():
    global responses
    request = HttpRequest()
    responses.append(view(request))

# Concurrent threads:
t1 = threading.Thread(target=runview)
t2 = threading.Thread(target=runview)

t1.start()
t2.start()
t1.join()
t2.join()

# Serial threads:
runview()
runview()

for r in responses:
    print r