我发现增量开发在为Hunchentoot编码时往往会中断。
例如,我可以编写一个由几个函数组成的网页。如果这些内部函数中有一个包含对-比如说- hunchentoot:post-parameters*的调用,那么我就不能很容易地在REPL中测试这个函数。它会出错,因为除非web客户端调用页面,否则*request*不存在。
如果有一些函数或其他源代码,这样我就可以测试我的函数了,这样就好了:
>(let* ((*request* (get-previous-request-from-somewhere))
(*session* (slot-value *request* 'hunchentoot:session)))
(my-function <whatever params>))它或类似的东西存在吗?我是否忽略了一种更好的调试方法?
发布于 2014-04-23 09:23:48
我的临时解决方案看起来像这样:
(defparameter *save-last-request* t)
(defvar *last-request* nil)
(defun store-request ()
(when *save-last-request*
(setf *last-request* *request*)))
(defmacro with-last-request (&body body)
`(let* ((*request* *last-request*)
(*session* (slot-value *request* 'hunchentoot:session)))
,@body))它可以很好地工作,但需要注意每个处理程序都需要调用store-request。
发布于 2015-02-20 20:01:04
我认为最简单的做法可能是使用一个自定义的请求类,它引入了一种将请求持久化到初始化器链中的方法。
下面是一种方法的一个简单示例。请求的一个自定义子类,它将其状态保存在全局堆栈中。
您可以使用以下命令将接受者设置为使用自定义的请求类
(setf (acceptor-request-class acceptor ) new-value)
所以像这样的东西
(defparameter *requests* nil)
(defclass my-request (hunchentoot:request) ())
(defmethod initialize-instance :after ((req my-request) &key)
(push req *requests*))然后将接受者请求类设置为在使接受者成为接受者时使用它。
(setf (hunchentoot:acceptor-request-class
(make-instance 'hunchentoot:easy-acceptor)) 'my-request)每当这个接受者创建一个请求传递给处理程序时,它都会被添加到*requests*列表中。
如果您使用一个变量来指定请求类的名称,那么您可以在开发/调试时打开和关闭这个类。
然后,您可以在测试绑定中从该堆栈获取请求。
https://stackoverflow.com/questions/22903139
复制相似问题