在Flask中使用AJAX添加上下文变量

Adding a context variable with AJAX in Flask

本文关键字:添加 上下文 变量 AJAX Flask      更新时间:2023-09-26

我有一个需要通过AJAX填充的选择表单。考虑这个简单的例子:

模板/index . html

<!DOCTYPE html>
<html>
<body>
<select id="elements">
</select>
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script>
    $.ajax({
        url: '/get-something/5',
        type: "GET",
        dataType: "html",
        success: function (msg) {
            $('#elements').html(msg)
        }
    })
</script>
</body>
</html>

app.py

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/get-something/<int:n>')
def get_something(n):
    result = ''
    for i in xrange(n):
        result += "<option value='%s'>%s</option>'n" % (i, i)
    return result

if __name__ == '__main__':
    app.run(debug=True)

工作得很好,这就是我所做的。但是,我想知道是否存在另一种(更好的?)方法。

例如,我更喜欢使用上下文变量来更好地将视图与控制器分开。像这样:

app.modified.py

@app.route('/get-something/<int:n>')
def get_something(n):
    return dict(elements=xrange(n))

模板/index.modified.html

<select id="elements">
    {% for elem in elements %}
        <option value='{{ elem }}'>{{ elem }}</option>'n
    {% endfor %}
</select>
不幸的是,不能工作。它说'dict'对象是不可调用的

请帮忙好吗?这可能吗?注意,我不想重新加载页面,我想要与AJAX示例中相同的行为。

使用索引。修改后,您需要这样做:

return render_template('index.modified.html',
                       elements=your_dictionary)

没有尝试返回一个字典(这就是为什么你会得到这个错误)。更多示例见http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ii-templates

您应该返回render_template('index.modified.html', elements=xrange(n)),因为您想要html。

render_template返回一个字符串,您可以将其编码为JSON。例:

data = render_template('index.modified.html', elements=xrange(n))
return json.dumps({'data': data})