首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从REPL访问Hunchentoot请求对象以进行调试

从REPL访问Hunchentoot请求对象以进行调试
EN

Stack Overflow用户
提问于 2014-04-07 11:31:55
回答 2查看 372关注 0票数 8

我发现增量开发在为Hunchentoot编码时往往会中断。

例如,我可以编写一个由几个函数组成的网页。如果这些内部函数中有一个包含对-比如说- hunchentoot:post-parameters*的调用,那么我就不能很容易地在REPL中测试这个函数。它会出错,因为除非web客户端调用页面,否则*request*不存在。

如果有一些函数或其他源代码,这样我就可以测试我的函数了,这样就好了:

代码语言:javascript
复制
>(let* ((*request* (get-previous-request-from-somewhere))
       (*session* (slot-value *request* 'hunchentoot:session)))
    (my-function <whatever params>))

它或类似的东西存在吗?我是否忽略了一种更好的调试方法?

EN

回答 2

Stack Overflow用户

发布于 2014-04-23 09:23:48

我的临时解决方案看起来像这样:

代码语言:javascript
复制
(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

票数 7
EN

Stack Overflow用户

发布于 2015-02-20 20:01:04

我认为最简单的做法可能是使用一个自定义的请求类,它引入了一种将请求持久化到初始化器链中的方法。

下面是一种方法的一个简单示例。请求的一个自定义子类,它将其状态保存在全局堆栈中。

您可以使用以下命令将接受者设置为使用自定义的请求类

(setf (acceptor-request-class acceptor ) new-value)

所以像这样的东西

代码语言:javascript
复制
(defparameter *requests* nil)
(defclass my-request (hunchentoot:request) ())
(defmethod initialize-instance  :after ((req my-request) &key)
  (push req *requests*))

然后将接受者请求类设置为在使接受者成为接受者时使用它。

代码语言:javascript
复制
(setf (hunchentoot:acceptor-request-class 
        (make-instance 'hunchentoot:easy-acceptor)) 'my-request)

每当这个接受者创建一个请求传递给处理程序时,它都会被添加到*requests*列表中。

如果您使用一个变量来指定请求类的名称,那么您可以在开发/调试时打开和关闭这个类。

然后,您可以在测试绑定中从该堆栈获取请求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22903139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档