我想在Jinja2模板中使用带参数的AJAX调用.但是我如何才能实现呢?我想做这样的事情.
JavaScript的:
$.get("test.html", { name: "John", time: "2pm" } );
Run Code Online (Sandbox Code Playgroud)
jinja模板:
<div>
{{name}} {{time}}
</div>
Run Code Online (Sandbox Code Playgroud)
您需要访问服务器端的请求对象以获取参数。我假设您正在使用 Flask,但如果不是,那么其他 Web 框架的基本思想也应该相同。假设您有一个简单的小 index.html,您可以在其中使用 Javascript 进行 Ajax 查询:
$.get("{{ url_for('ajax') }}", {name: "John", time: "2pm"});
Run Code Online (Sandbox Code Playgroud)
请注意,如果您不使用 Jinja2 来呈现脚本部分,请将 url_for() 调用替换为实际的 URL,因此在下面的示例中类似于 /ajax:
$.get("/ajax", {name: "John", time: "2pm"});
Run Code Online (Sandbox Code Playgroud)
现在,在服务器端,你会有这样的事情:
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/ajax')
def ajax():
#Access arguments via request.args
name = request.args.get('name')
time = request.args.get('time')
#NOTE: In real code, check that the arguments exist
#Silly logging call to show that arguments are there
app.logger.info(name)
app.logger.info(time)
#Do stuff here to do what you want or modify name/time
...
#Render template and pass the arguments to it
return render_template('ajax.html',
name=name,
time=time)
@app.route('/index')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)
ajax.html 看起来像这样,例如:
<h2>{{ name }}</h2>
<h2>{{ time }}</h2>
Run Code Online (Sandbox Code Playgroud)
因此 request.args 是您可以访问通过 GET 传递的参数的地方,但您需要使用 render_template() 调用将它们显式传递给 Jinja2。Jinja2 只是一种模板语言,它不知道您的参数 (1),除非您将它们传递给它。
1) 有一些例外。例如,Flask 确实隐式地将一些参数传递给 Jinja2,就像请求对象一样。