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 -~----------~----~----~----~------~----~------~--~---