Solution officielle
class ArticleViewSet:
def __init__(self):
self.db = {}
self.next_id = 1
def list(self):
return {'status': 200, 'data': list(self.db.values())}
def create(self, data):
article = dict(data)
article['id'] = self.next_id
self.db[self.next_id] = article
self.next_id += 1
return {'status': 201, 'data': article}
def retrieve(self, pk):
if pk not in self.db:
return {'status': 404, 'error': 'Non trouve'}
return {'status': 200, 'data': self.db[pk]}
def update(self, pk, data):
if pk not in self.db:
return {'status': 404, 'error': 'Non trouve'}
self.db[pk].update(data)
self.db[pk]['id'] = pk
return {'status': 200, 'data': self.db[pk]}
def destroy(self, pk):
if pk not in self.db:
return {'status': 404, 'error': 'Non trouve'}
del self.db[pk]
return {'status': 204, 'data': None}
def dispatch(self, method, data=None, pk=None):
if method == 'GET' and pk is None:
return self.list()
elif method == 'POST' and pk is None:
return self.create(data)
elif method == 'GET' and pk is not None:
return self.retrieve(pk)
elif method == 'PUT' and pk is not None:
return self.update(pk, data)
elif method == 'DELETE' and pk is not None:
return self.destroy(pk)
return {'status': 405, 'error': 'Méthode non autorisee'}
class SimpleRouter:
def __init__(self):
self.routes = {}
def register(self, prefix, viewset):
self.routes[prefix] = viewset
def resolve(self, method, path, data=None):
parts = path.strip('/').split('/')
if not parts:
return {'status': 404, 'error': 'Route non trouvee'}
prefix = parts[0]
if prefix not in self.routes:
return {'status': 404, 'error': 'Route non trouvee'}
viewset = self.routes[prefix]
pk = None
if len(parts) >= 2 and parts[1].isdigit():
pk = int(parts[1])
return viewset.dispatch(method, data=data, pk=pk)