Hunchentoot调度员

时间:2017-02-28 17:18:55

标签: common-lisp hunchentoot

我对Common Lisp(SBCL)和Hunchentoot(使用Quicklisp)相对较新。有人能告诉我如何才能让它发挥作用吗?我正在尝试将Hunchentoot服务器和一些路径作为一个单元包装在一个函数中。当我运行它时,只有Hunchentoot的索引页面可用,路径/ a和/ b不可用。

(defun app0 (port)
  (let ((*dispatch-table* nil) (server (make-instance 'hunchentoot:acceptor :port port)))
    (push (hunchentoot:create-prefix-dispatcher "/a" (lambda () "a")) *dispatch-table*)
    (push (hunchentoot:create-prefix-dispatcher "/b" (lambda () "b")) *dispatch-table*)
    (hunchentoot:start server) server))

1 个答案:

答案 0 :(得分:3)

据我所见,存在多个问题。首先,通过*dispatch-table*处理请求,要求接受者属于easy-acceptor类型,即您必须

(make-instance 'easy-acceptor ...)

documentation有详细信息。

第二个问题是,您在设置代码期间重新绑定*dispatch-table*,并将新值推送到此绑定中。由于在let完成后恢复绑定(并且hunchentoot:start异步工作),因此当服务器运行时,*dispatch-table*中的条目实际上会丢失。尝试

(push (hunchentoot:create-prefix-dispatcher "/a" (lambda () "a")) *dispatch-table*)
(push (hunchentoot:create-prefix-dispatcher "/b" (lambda () "b")) *dispatch-table*)

在顶级(或在专用设置功能中执行类似操作)。如果您不喜欢全局*dispatch-table*方法,您还可以创建acceptor的子类,并覆盖acceptor-dispatch-request(从而实现您喜欢的任何类型的调度)。

正如旁注:您不会在*dispatch-table*的前缀中添加前缀hunchentoot的前缀:use。这只是一个复制/粘贴错误,还是在您的实际代码中也是如此?如果您的代码所在的任何地方都没有hunchentoot hunchentoot:*dispatch-table*个套餐,那么您还必须将调度表限定为(defclass vhost (tbnl:acceptor) ((dispatch-table :initform '() :accessor dispatch-table :documentation "List of dispatch functions")) (:default-initargs :address "127.0.0.1")) (defmethod tbnl:acceptor-dispatch-request ((vhost vhost) request) (mapc (lambda (dispatcher) (let ((handler (funcall dispatcher request))) (when handler (return-from tbnl:acceptor-dispatch-request (funcall handler))))) (dispatch-table vhost)) (call-next-method)) (defvar vhost1 (make-instance 'vhost :port 50001)) (defvar vhost2 (make-instance 'vhost :port 50002)) (push (tbnl:create-prefix-dispatcher "/foo" 'foo1) (dispatch-table vhost1)) (push (tbnl:create-prefix-dispatcher "/foo" 'foo2) (dispatch-table vhost2)) (defun foo1 () "Hello") (defun foo2 () "Goodbye") (tbnl:start vhost1) (tbnl:start vhost2)

修改(以解决评论部分中的问题)有一个example in the hunchentoot documentation,它似乎完全符合您的要求:

tbnl

(为简洁起见,文档中的注释已删除)。 hunchentoot是包awk 'BEGIN{ FS=OFS=";" CONVFMT="%.2f" } { c2+=$2; c5+=$5 } END{ $2=c2; $5=c5; print }' file1 file2 file3 的预定义昵称。您可以互换使用,虽然我建议您选择一个并坚持下去。混合两者可能会产生混淆。