使用Jinjia模板语法将数据传递给JavaScript变量
网上很容易查到jinjia循环加载后端传来的数据到页面上的方法,但是很难搜到怎么通过jinjia获取flask后端传过来的数据给java script的变量赋值,特此记录。
先来看一下我们传输的数据:
@test_bp.route('/test')
def test():
role = "admin"
permission = ["r1","r2","r3"]
project = [
["project","project","project","non-project","non-project"],
["p1","p2","p3","tool","other"]
]
action= {
"p1":["a1","a2","a3"],
"p2":["b1"],
"p3":["c1","c2"],
"tool":["design","development"],
"other":["please specify"]
}
return render_template('test.html', action=action,project=project,role=role,premission=permission)
【方法一】:最初找到的方法,非常复杂,根据传来的数据的结构通过Jinjia不断循环
<script> // 在js里先建好空数据 let role = "" let permission = [] let sourceAllProjects = [] let sourceAllActions = {} </script> <!--把jinjia2的变量赋值到js的变量--> <!-- 传一个字符串变量--> <script type="text/javascript"> role = '{{role}}' //记得这里有引号 </script> <!-- 传一个列表变量--> {% for p in permission %} <script type="text/javascript"> permission.push('{{p}}'); </script> {% endfor %} <!-- 传一个列表套列表--> {% for p in project %} <script type="text/javascript"> temp = ["",] </script> {% for pp in p %} <script type="text/javascript"> temp.push('{{pp}}'); </script> {% endfor %} <script type="text/javascript"> sourceAllProjects.push(temp); </script> {% endfor %} <!-- 传一个字典套列表--> {% for k,v_list in action.items() %} <script type="text/javascript"> temp = [""] </script> {% for v in v_list %} <script type="text/javascript"> temp.push('{{v}}') </script> {% endfor %} <script type="text/javascript"> sourceAllActions["{{ k }}"] = temp </script> {% endfor %} <script> $(document).ready(function() { console.log(role) console.log(permission) console.log(sourceAllProjects) console.log(sourceAllActions) }) </script>
最后的结果:
【方法二】:我真的栓Q,其实这样就好了
<script> var action = {{ action | tojson }}; var project = {{ project | tojson }}; var role = "{{ role }}"; //记得这里要用引号! var permission = {{ permission | tojson }};$(document).ready(function() { console.log(role) console.log(permission) console.log(project) console.log(action) })</script>
欲哭无泪,第一种方法用了很久..写得我眼睛都瞎了
csdn上没有搜到过详述这种方法的,特此记录