Регистрация | Войти
Lisp — программируемый язык программирования
RSS
Проблема с декораторами
sviridov - 27.02.2013 19:17, Сообщений - 7
Есть вот такой код:

(defclass  auth-route (proxy-route) ())
(defclass !auth-route (proxy-route) ())

;=============================================================================

(defmethod route-check-conditions ((route auth-route) bindings)
  (if (user-authorized?) t (redirect 'auth))
)


(defmethod route-check-conditions ((route !auth-route) bindings)
  (not (user-authorized?)))


;=============================================================================

(defun @auth-require (route)
  (make-instance 'auth-route :target route)
)


(defun @!auth-require (route)
  (make-instance '!auth-route :target route)
)


;=============================================================================

(define-route auth ("login" :method :get)
  (:decorators '@!auth-require)
  ...
)


;=============================================================================

(define-route handle-auth ("login" :method :post)
  (:decorators '@!auth-require)
  ...
)


;=============================================================================

(define-route index ("")
  (:decorators '@auth-require)
  ...
)

Т.е. я не хочу, чтоб пользователь мог зайти на "../login". Но такая штука не работает... До handle-auth дело не доходит. На POST отвечает один черт GET-роут. Без декораторов все работает. Эни хелп?
[#]
> Т.е. я не хочу, чтоб пользователь мог зайти на "../login"
После успешного входа
sviridov - 27.02.2013 19:18
[#] Ответ на комментарий от sviridov 27.02.2013 19:18
Ааааа...)

(defmethod route-check-conditions ((route !auth-route) bindings)
  (when (not (user-authorized-p))
    (call-next-method)))

sviridov - 27.02.2013 19:46
[#]
> (defmethod route-check-conditions ((route auth-route) bindings)
>   (if (user-authorized?) t (redirect 'auth)))
> (defmethod route-check-conditions ((route !auth-route) bindings)
>  (not (user-authorized?)))

Ты же зарубил встроенyю проверку. Необходимо добавить (call-next-method) или типа того.


archimag - 27.02.2013 19:52
[#] Ответ на комментарий от archimag 27.02.2013 19:52
Чет я опять затупил) Вот такой код:

(defclass  auth-route (proxy-route) ())
(defclass !auth-route (proxy-route) ())

;=============================================================================

(defmethod route-check-conditions ((route auth-route) bindings)
  (if (user-authorized-p)
      (call-next-method)
      (redirect 'auth)
)
)


(defmethod route-check-conditions ((route !auth-route) bindings)
  (unless (user-authorized-p)
    (call-next-method)
)
)


;=============================================================================

(defun @auth-require (route)
  (make-instance 'auth-route :target route)
)


(defun @!auth-require (route)
  (make-instance '!auth-route :target route)
)


;=============================================================================

(define-route auth ("login")
  (:decorators '@!auth-require)
  ...
)


(define-route warn-auth ("login")
  (:decorators '@auth-require)
   ...
)

Т.е. я хочу, чтоб если пользователь уже зашел в систему, ему при повторном переход на "../login" выдавалась другая страница. Беда в том, что при обработке этого дело происходит бесконечное количество вызовов этого дела:

(defmethod route-check-conditions ((route auth-route) bindings)
  (if (user-authorized-p)
      (call-next-method)
      (redirect 'auth)
)
)

т.е. ни до роутов, ни до @!auth-require дело не доходит. Такое ощущение, что при редиректе на auth идут проверки для warn-auth....
sviridov - 28.02.2013 17:17
[#] Ответ на комментарий от sviridov 28.02.2013 17:17
Если сделать вот так:

(defmethod route-check-conditions ((route auth-route) bindings)
  (print "hear!")
  (if (user-authorized-p)
      (call-next-method)
      (redirect 'auth)
)
)


(defmethod route-check-conditions ((route !auth-route) bindings)
  (print "hear2!")
  (unless (user-authorized-p)
    (call-next-method)
)
)

На печати будет только "hear!"
sviridov - 28.02.2013 17:20
[#] Ответ на комментарий от sviridov 28.02.2013 17:20
Ну и это все входит в бесконечный цикл еще до того как пользователь залогинился.
sviridov - 28.02.2013 17:22
[#] Ответ на комментарий от sviridov 28.02.2013 17:22
Все, понял:

(defun redirect (route-symbol &rest args)
  (hunchentoot:redirect
   (hunchentoot:url-decode
   ...
)
)
)
sviridov - 28.02.2013 19:50
@2009-2013 lisper.ru