понедельник, 28 февраля 2011 г.

Декораторы

В предыдущем сообщении я использовал термин "middleware", который показался мне в итоге не очень удачным. Всё же middleware это больше про WSGI или про тот же Clack. А в контексте RESTAS более точным и адекватным видимо является термин "декоратор". Я изменил это в коде, а также добавил несколько новых возможностей.

Теперь restas:define-module и restas:define-route имеют keyword аргумент :decorators, в котором можно указать список декораторов, используемых для преобразования маршрутов. Вместо :decorators в restas:define-module также можно использовать переменную *decorators*, создаваемую при определении модуля. Т.е. теперь указывать декораторы можно при определении модуля, определении маршрута и подключении субмодуля. При этом, декораторы, указанные на различных уровнях, не замещают друг друга, а применяются последовательно.

В качестве примера декоратора, а также как просто удобную возможность, добавил restas:no-cache-decorator:
(defclass no-cache-route (routes:proxy-route) ())

(defmethod process-route :before ((route no-cache-route) bindings)
(setf (hunchentoot:header-out :expires)
(hunchentoot:rfc-1123-date))
(setf (hunchentoot:header-out :cache-control)
"max-age=0, no-store, no-cache, must-revalidate"))

(defun no-cache-decorator (route)
(make-instance 'no-cache-route :target route))
Кстати, функция no-cache из Hunchentoot, делает какую-то ерунду.

2 комментария:

  1. Вспомнил! Как-то раз мне не хватало именно декораторов. Скоро надо будет сильно извратится чтобы придумать что-либо ещё для RESTAS ;)

    ОтветитьУдалить
  2. @linkfly

    "Совершенство это не когда нечего добавить, а когда нечего отнять." (c) ))

    ОтветитьУдалить