You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Julia/Genie框架技术问题:如何实现路由刷新时自动调用函数更新页面内容?

解决Genie框架中好友列表无法自动更新的问题

你的问题核心在于误用了Julia宏来生成运行时需要动态更新的内容——Julia的宏是在编译阶段执行的,而不是每次请求时运行,这就导致好友列表只会在代码第一次编译时生成一次,后续数据库更新不会触发它重新获取数据。下面是具体的修复方案:

1. 将宏改为普通函数

把@htmlFriends宏替换成普通函数,这样每次调用时都会重新查询数据库,生成最新的好友列表HTML:

# 替换原来的@htmlFriends宏
function htmlFriends()
  str1 = ""
  friendList = getFriends().friend
  for x in friendList
    str = "<li>$x</li>\n"
    str1 *= str  # 用+=更简洁,效果一致
  end
  return str1
end

然后在logFriend函数中,把宏调用改成函数调用:

function logFriend()
  m1 = htmlFriends()  # 替换原有的@htmlFriends宏调用
  pa = "style='text-align:left'"  # 补全闭合引号,修复原代码的小疏漏
  logPage = """
  <body style="text-align:left">
    <form action="/" method="POST" enctype="multipart/form-data">
      <script>
        for (let i=0; i<9;i++)
          document.write("hi");
      </script>
      <h3>List of Friends</h3>
      <ul>$m1</ul>  <!-- 给列表添加<ul>标签,符合HTML规范 -->
      <div>
        friend! 
        <input type="text" name="friend" value="" />
      </div>
      <div>
        <input type="submit" value="submit" />
      </div>
    </form>
  </body>
  """
  return logPage
end

小提示:我顺便调整了HTML结构——把<form>放在<body>内部,给好友列表补了<ul>容器,这些小调整能让页面更符合规范,避免潜在的渲染异常。

2. 修复POST路由的响应逻辑

原来的POST路由返回DataFrame,会导致客户端收到原始数据而非页面。正确的做法是在插入数据后重定向到GET路由,让客户端重新请求页面,从而加载最新的好友列表:

route("/", method = POST) do
  queries.insertFriend(postpayload(:friend))
  redirect("/")  # 重定向到GET "/",触发页面自动刷新
end

为什么原来的宏方案不行?

Julia的宏是在代码编译阶段执行的:当你第一次运行logFriend时,@htmlFriends会被展开成当时生成的HTML字符串,之后这个字符串就被硬编码到函数里了——哪怕数据库里的好友数据更新,logFriend返回的还是第一次编译时的旧内容。而普通函数是每次调用都会重新执行逻辑,每次都会去数据库拉取最新数据,自然就能生成更新后的列表了。

现在再测试一下:提交新好友后页面会自动重定向并加载最新列表,手动刷新页面也会调用htmlFriends获取最新数据,问题应该就解决了!

内容的提问来源于stack exchange,提问作者neutrino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 04:53:16