Я не могу говорить за Django, но в CherryPy вы можете иметь одну функцию для каждого глагола HTTP с одной записью конфигурации:
request.dispatch = cherrypy.dispatch.MethodDispatcher()
Однако я видел ситуации, когда это нежелательно.
Одним из примеров будет жесткий перенаправление независимо от глагола.
Другой случай, когда большинство ваших обработчиков обрабатывают только GET. В этом случае особенно неприятно иметь тысячу обработчиков страниц с именем «GET». Это лучше выразить в декораторе, чем в имени функции:
def allow(*methods):
methods = list(methods)
if not methods:
methods = ['GET', 'HEAD']
elif 'GET' in methods and 'HEAD' not in methods:
methods.append('HEAD')
def wrap(f):
def inner(*args, **kwargs):
cherrypy.response.headers['Allow'] = ', '.join(methods)
if cherrypy.request.method not in methods:
raise cherrypy.HTTPError(405)
return f(*args, **kwargs):
inner.exposed = True
return inner
return wrap
class Root:
@allow()
def index(self):
return "Hello"
cowboy_greeting = "Howdy"
@allow()
def cowboy(self):
return self.cowboy_greeting
@allow('PUT')
def cowboyup(self, new_greeting=None):
self.cowboy_greeting = new_greeting
Еще один распространенный пример - поиск данных, соответствующих ресурсу в базе данных, что должно происходить независимо от глагола:
def default(self, id, **kwargs):
# 404 if no such beast
thing = Things.get(id=id)
if thing is None:
raise cherrypy.NotFound()
# ...and now switch on method
if cherrypy.request.method == 'GET': ...
CherryPy пытается не принимать решение за вас, но упрощает (однострочно), если вы этого хотите.