2015-03-29 19 views
6

Tôi cần có quyền truy cập vào mẫu jinja trong tệp javascript (do thẻ i18n). Vì vậy, cách mà tôi tìm thấy chỉ là tải các tập tin js với bao gồm, từ phương pháp jinja. {% include "file.js" %}Nhập tệp javascript bằng jinja từ thư mục tĩnh

Tuy nhiên, phương pháp này sẽ chỉ tìm kiếm tệp trong thư mục mẫu. Nhưng các tệp js phải nằm trong thư mục tĩnh. Câu hỏi của tôi là, làm thế nào tôi có thể thay đổi cách thức jinja tìm kiếm các tập tin? Thay vì tìm kiếm trong thư mục mẫu, trong trường hợp này, tìm kiếm trong thư mục tĩnh.

{% block javascript %} 
    <script type="text/javascript"> 
     {% include "myscript.js" %} 
    </script> 
{% endblock %} 
+0

bạn có thể sử dụng [ 'url_for (' static ', filename =' script.js ') '] (http://flask.pocoo.org/docs/0.10/quickstart/#static-files) nếu bạn đặt các tệp của mình trong ** static ** dir – kartheek

+2

@kartheek điều đó không hữu ích trong trường hợp này, người dùng này muốn coi tệp là mẫu – davidism

Trả lời

4

Nếu bạn cần xử lý tệp dưới dạng mẫu, thì nó không tĩnh. Đặt nó vào thư mục templates và render nó. Nếu tệp là không phải là động, thì tệp đó là tĩnh. Đặt nó vào thư mục tĩnh và liên kết đến nó. Không có yêu cầu rằng một loại tệp nhất định phải là mẫu hoặc tệp tĩnh. Chọn cái nào là cần thiết.

Mặt khác, có lẽ tốt hơn là giữ cho JS tĩnh và chuyển đối số cho nó, thay vì tạo mã khác dựa trên đầu vào khác nhau.

+0

Hmm, điều đó nghe có vẻ hợp lý. Nó chỉ không cảm thấy sạch sẽ với tôi, để có một (năng động, mẫu thay đổi) tập tin javascript bên trong thư mục "mẫu" - nhưng có lẽ đó là cách để đi. – lakerz

+0

Trong khi đó là một cái nhìn tốt cho hoàn cảnh bình thường, có những lúc JS cần phải được bao gồm (ví dụ như rendering một trang 500). –

5

Cho một cấu trúc ví dụ thư mục đó trông như thế này

app/static/css/bootstrap.min.css 
app/static/js/bootstrap.min.js 
app/templates/test_page.html 
app/views 
run_server 

Bạn có thể đặt bình static_url_path khi bạn tạo đối tượng ứng dụng

app = Flask(__name__, static_url_path='/static') 

và sau đó trong test_page.html bạn có thể có cái gì đó trông giống như này

<link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet"> 

I'm an html body 

<script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script> 
+0

Bạn không cần đặt đường dẫn url tĩnh trong ví dụ của mình, đó là mặc định. Ngoài ra, điều này không trả lời câu hỏi, vì họ muốn biết cách xử lý tệp javascript dưới dạng mẫu. – davidism

+0

Cảm ơn bạn đã phản hồi. Tôi muốn được rõ ràng về con đường trong trường hợp này bởi vì nó là một tính năng mà tôi không biết trong một thời gian dài. Ngoài ra, tôi đồng ý rằng họ đang hỏi về việc xử lý tệp javascript dưới dạng mẫu nhưng tôi đã đưa ra câu trả lời mà tôi nghĩ có thể giải quyết được vấn đề cơ bản của họ, bất chấp cách họ hỏi. = P – AlexLordThorsen

1

Bạn có thể cre ăn và đăng ký một chức năng toàn cầu chỉ làm điều đó:

import os 

app = Flask(__name__.split('.')[0]) 

@app.template_global() 
def static_include(filename): 
    fullpath = os.path.join(app.static_folder, filename) 
    with open(fullpath, 'r') as f: 
     return f.read() 

Và sau đó bạn có thể đưa nó như thế này (các safe -filter ngăn ngừa dấu ngoặc kép bắt đầu thoát):

{% block javascript %} 
    <script type="text/javascript"> 
     {{ static_include("myscript.js") | safe }} 
    </script> 
{% endblock %} 
Các vấn đề liên quan