[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GMG-Devel] [proposal] Class-based views
From: |
Joar Wandborg |
Subject: |
[GMG-Devel] [proposal] Class-based views |
Date: |
Mon, 23 Apr 2012 21:36:01 +0200 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
This is my proposal for the new view structure, feedback welcome.
These are changes that would be implemented to help in the development of
the MediaGoblin API.
Currently we have method-based views
- Views are methods with at least one parameter (request) that holds request
information and additional instantiated objects and methods such as `db`,
`user`, `staticdirect`, `session`.
- View methods are decorated to, for example:
- Force login on the current page.
- Enable pagination
- Fetch a model to a view based on request data
What we would need is
- Separate common logic from rendering logic
- Have multiple rendering methods (`as_json()`, `as_html()`)
- Provide classes for, for example pagination and fetching a model based on
request data ('mixin's?)
class MediaView(View, MediaEntryMixin):
def setup(self):
pass
def as_json(self):
import simplejson
simplejson.dumps(self.media.public_data())
def as_html(self):
return render_to_response(
request,
get_media_manager(media.media_type)['display_template'],
{'media': self.media,
'comments': comments,
'pagination': pagination
...}
class MediaEntryMixin(object):
@property
def media(self):
if self._media:
return self._media
else:
self._media = self.request.db.MediaEntry.find_one(
...)
class View(object):
def __init__(self, request):
self.request = request
def __call__(self, request):
self.setup()
if wants_json:
return self.as_json()
else:
return self.as_html()
- [GMG-Devel] [proposal] Class-based views,
Joar Wandborg <=