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
相关产品推荐
相关产品推荐

