V: Defining a __call__ method will make *instances* of the class callable. Calling the class itself will still just instantiate it.
On Tue, Aug 26, 2008 at 7:00 AM, V <[EMAIL PROTECTED]> wrote: > > Hi! > > Interesting solution. > > Another possibility if you would like to stick with a class is to > simply define a __call__ method on the class. Of course, this doesn't > have to do anything with RESTfulness. > > V > > On Aug 26, 3:07 am, zvoase <[EMAIL PROTECTED]> wrote: > > Hey Django users, just a quick suggestion which might help a few > > people. > > I have come up with a way of writing a Django view as a class. I've > > done this as part of an effort to write easier-to-understand RESTful > > apps, as this allows the grouping of similar views as different types > > of operation on a resource. Essentially, the solution goes something > > like this: > > > > * Views have to be callables which return HttpResponse objects. > > * The problem with views as classes is that calling a view class > > returns an instance of the view class, not HttpResponse. > > * Solution: have the VC (view class) a subclass of HttpResponse. > > This way, 'calling' the class will return a HttpResponse instance. > > > > I've written a general class, Resource, which performs a dispatch on > > the request method, so that a resource can be retrieved, created/ > > updated and deleted by writing 'get', 'put' and 'delete' methods on a > > subclass of Resource. > > > > A sample resource may look like this: > > > > # CODE START # > > > > class Book(Resource): > > def get(self, request, book_name): > > book = myapp.models.Book.objects.get(name=book_name) > > return render_to_response('book_template.html', {'book': > > book}) > > > > def put(self, request, book_name): > > new_book, created = get_or_create(myapp.models.Book, > > name=book_name) > > new_book.data = request.raw_post_data > > if created: > > return HttpResponse(status=201) > > return HttpResponse(status=200) > > > > def delete(self, request, book_name): > > book = myapp.models.Book.objects.get(name=book_name) > > book.delete() > > return HttpResponse() > > > > # CODE END # > > > > You can see how these methods correspond to GET, PUT and DELETE > > request methods, and the dispatch is performed in the __init__ method > > defined in the Resource class. HttpResponse instances can be returned > > from these methods, and their data will be merged with 'self' by > > __init__. > > > > Okay, so here's the code I've written: > > > > # CODE START # > > > > class Resource(HttpResponse): > > def __init__(self, request, *args, **kwargs): > > HttpResponse.__init__(self) > > if hasattr(self, request.method.lower()): > > value = getattr(self, > request.method.lower())(request, *args, > > **kwargs) > > if isinstance(value, HttpResponse): > > self.update(value) > > elif hasattr(self, 'run'): > > value = self.run(request, *args, **kwargs) > > if isinstance(value, HttpResponse): > > self.update(value) > > > > def update(self, response): > > self._charset = response._charset > > self._is_string = response._is_string > > self._container = response._container > > self._headers.update(response._headers) > > self.cookies.update(response.cookies) > > self.status_code = response.status_code > > > > def render_to_response(self, *args, **kwargs): > > self.update(render_to_response(*args, **kwargs)) > > > > # CODE END # > > > > I hope people find this useful. > > > > Regards, > > Zack > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---