Python模板和Ajax
我想不出一个更好的标题,所以如果有人觉得这个标题不合适,请随意修改。
我在用flask这个Python框架,通常我会像下面这样渲染模板:
@app.route('/home')
def userhome():
data=go get user details from the database
return render_template("home.html",userdata=data)
现在我有一个叫home.html的模板,在这个模板里,我会遍历“userdata”的值,比如userdata.name、userdata.age等等,这些值会在模板里占据合适的位置。
不过,我正在做一个应用,这个应用的导航是通过ajax来实现的,如果没有JavaScript就无法使用(也就是说,没有JavaScript的人是无法使用这个应用的)。导航菜单左边有几个标签(比如首页、你的优惠、你最近阅读的书籍)。右边的内容会根据用户点击的不同而动态变化。
我不太明白在这种情况下该如何处理模板。根据用户的点击,我可以通过xhrGET或xhrPOST从数据库发送所需的数据,返回一个JSON格式的数据。那整个模板的处理是不是必须在服务器端完成,然后通过ajax调用把整个模板传送过来呢?我其实不太喜欢这个想法。如果有人能给我指个方向就太好了。
现在在通过ajax加载的页面里,有一些脚本。这些脚本如果通过ajax加载的话,会正常工作吗?
2 个回答
你有两种选择:在服务器上生成模板,或者在浏览器中生成模板。
如果选择在服务器上生成模板,你需要创建一个新的接口,和你现在已有的差不多,不过这个模板只负责生成页面的一部分。然后你用Ajax请求这个网址,把返回的HTML插入到你的页面中。
如果选择在浏览器中生成模板,你的接口会返回一个JSON格式的响应。接着,你可以使用一个JavaScript模板库来处理这个JSON,把它转换成HTML,然后插入到页面里。比如,有很多jQuery的模板解决方案可以选择。
我会选择服务器端模板,因为除非你找到一个能处理相同模板语言的JS库,否则你的代码就不会做到干净整洁。
在home.html
这个模板里,我会这样做:
<%extends base.html%>
<%include _user_details.html%>
... <% footer and other stuff%>
然后把实际的标记放在_user_details.html
里。这样的话,对于一个AJAX请求,你只需要渲染_user_details.html
这个部分就可以了。