2015-01-13 511 views
8

我爲我的網站使用Python Flask,並將幾個參數傳遞給Javascript。這是我的代碼:在外部Javascript中傳遞參數與Python Flask

from flask import Flask 
from flask import render_template 

app = Flask(__name__) 


@app.route("/") 
def index(): 

    return render_template("index.html", param1="Hello") 


<html> 
    <head> 
    </head> 
    <body> 
     <p>Hello World</p> 
    </body> 
    <script>console.log({{param1}})</script> 
</html> 

用這種方法,它可以毫無問題地工作。這個例子是我自己的簡化。但是,如果我想有一個外部文件中的腳本並調用它是這樣的:

<html> 
    <head> 
    </head> 
    <body> 
     <p>Hello World</p> 
    </body> 
    <script src="/static/js/myjs.js"></script> 
</html> 

而且myjs.js文件是console.log({{param1}}),那麼這是行不通的。那麼,有什麼方法可以用Python Flask在外部Javascript文件中傳遞參數嗎?

+0

腳本必須在模板目錄內 – Hackaholic

+0

我有兩個文件夾:1)靜態模板和2)模板。在靜態文件夾中有css,js和圖像。我應該移動js文件ijn模板以使其工作嗎? – Tasos

回答

12

如果你想渲染一個帶有Jinja的文件,你需要調用render_template並將其傳遞給期望的值。直接鏈接到一個靜態文件顯然不會這樣做。一種解決方案是使用Jinja的include塊。這要求'myjs.js'位於'templates/js'文件夾中,並將其包含在渲染模板中,將所有模板上下文傳遞給包含的模板。

<script>{% include 'js/myjs.js' %}</script> 

更好的解決方案是不需要渲染在每次請求的JS,而是從你的模板參數傳遞給JS的功能。

<script src="{{ url_for('static', filename='js/myjs.js') }}"></script> 
<script> 
    my_func({{ my_var|tojson }}); 
</script> 
0

我用不同的方式來加載在HTML頁面中指定的JavaScript文件:

首先,我定義裏面<head></head>標籤一些變數,所以我打電話給我的javascript文件:

<head> 
... 
<script src="/static/js/jquery.js"></script> 
<script type=text/javascript> 
    $(document).ready(function() { 
     $link_subcat = "{{ url_for('load_subcategories') }}"; 
     $link_cat = "{{ url_for('load_categories') }}"; 
    }); 
</script> 

    <script src="{{ url_for('static', filename='finances.js') }}"></script> 

...

這是我的JavaScript文件內容: $(文件)。就緒(函數(){

 $("#category").change(function() { 
      $.ajax({ 
       type: "POST", 
       url: $link_subcat, 
       data: {cat: $(this).val()}, 
       success: function(data) { 
        $("#subcategory").html(data); 
       } 
      }); 
     }); 

     $("input[name=type]").change(function() { 
      $.ajax({ 
       type: "POST", 
       url: $link_cat, 
       data: {type: $('input[name="type"]:checked').val()}, 
       success: function(data) { 
        $("#category").html(data); 
       } 
      }); 
     }); 

    }); 

這種方法適用於我。