微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Clojure luminus 和多个相同的请求参数

如何解决Clojure luminus 和多个相同的请求参数

刚玩过 Luminus,我有一个简单的搜索功能

(def filename "/somewhere/on/my/harddrive")
(defn search [request]
  (let [q (-> request :params :q)]
    (layout/render request "results.html" {:data (helpers/match-lines-from-filename q filename)})))

在访问 localhost:3000/search?q=foo 时一切都很好。但是,当我访问 localhost:3000/search?q=foo&q=bar 时,出现以下错误

class clojure.lang.PersistentVector cannot be cast to class java.lang.CharSequence

我确切地知道问题是什么,第一个 URL 将 {:q "foo"} 插入到参数中,而后者给出了 {:q ["foo" "bar"]}。我可以用这样的东西在我的控制器中进行修复:

(if (string? q) q (last q))

但作为 Luminus 和 Clojure 的初学者,我不确定我是否理解错了。我一直在互联网上搜索现有技术,但没有成功。

我知道 Struct library。这似乎进行了一半,但使用 st/string 会给出错误“必须是字符串”,而不仅仅是取最后一个值。

明确地说,我可能可以在我自己的代码中停止 500 错误,但我只是希望 Luminus 文档中的某处有一行可以满足使用多个相同键的工作(TM),并且尽量少做文章.与其他框架进行比较(据我所知,我多年未使用的一些框架的信息):

  • Django:返回提供的最后一个
  • Rails:采用提供的最后一个参数,除非键以 [] 结尾,在这种情况下,它强制一个列表。
  • MojolicIoUs:提供了两种不同的返回参数的方法,一种像 Django,另一种总是给出一个列表(即使是空的)
  • Python urlparse:总是返回一个列表

这些对我来说都更直观,但如果我遗漏了什么,请告诉我。

附录

根据 @noah-bogart 将其转化为特定问题的好建议,这里有一个尝试:在我看来,Luminus 中的认行为通过上面概述的易于重现的客户端机制给出 500 个错误。其他 Web 框架可以有效地防止这种情况发生,而不会给最终开发人员带来任何成本,这在上面再次概述。 Luminus 或更广泛的生态系统中是否有提供此功能的中间件或命名空间?

发布附录

为了扩展我在上面写的关于 Django 的内容,该框架具有与 MojolicIoUs 类似的过程,您可以在其中指定是需要 list 还是 single value

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。